Python 执行 MySQL 事务,,一、MySQL 事务


一、MySQL 事务

事务就是指逻辑上的一组 SQL 操作,组成这组操作的各个 SQL 语句,执行时要么全成功要么全失败。

举个例子,小明给小红转账100元,转账过程实际上就是小明的账户减少100元,小红的账户增加100元,对应的SQL语句为:

update account set money=money-5 where name=‘xiaoming‘;
update account set money=money+5 where name=‘xiaohong‘;

上述的两条SQL操作,在事务中的操作就是要么都执行成功,要么都执行失败,如果只有第一条成功,那么小明就损失100元,而小红并没有收到100元,这是不可取的,所以这就是事务,事务就是指逻辑上的一组 SQL 操作,组成这组操作的各个 SQL 语句,执行时要么全成功要么全失败。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行,在 MySQL 中只有使用了 Innodb 库引擎的数据库或表才支持事务,所以很多情况下我们都使用 Innodb 引擎.

事务的特性如下:

原子性:事务是一个不可分割的单位,事务中的所有 SQL 操作要么都成功,要么都失败
一致性:事务发生前和发生后,数据的完整性必须保持一致
隔离性:当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其它的会话是不可见的,多个并发事务之间的数据是相互隔离的
持久性:一个事务一旦被提交,它对数据库中的数据改变就是永久性的,如果出了错误,事务也不允许撤销,只能通过 "补偿性事务"

mysql> begin      # 开启事务mysql> rollback   # 回滚事务mysql> commit     # 提交事务

数据库默认事务是自动提交的,也就是说,当我们执行select,insert,update,delete 等操作时,就会自动提交事务,如果关闭事务的自动提交,那么我们执行完select,insert,update,delete 操作后需要再执行 commit 来提交事务,否则就不会执行

二、游标

游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果,用法如下:

In [1]: import MySQLdbIn [2]: c = MySQLdb.connect(user=‘root‘, passwd=‘pzk123‘, db=‘mysql‘)    # 连接数据库In [3]: cus = c.cursor()                      # 创建一个游标对象In [4]: cus.execute(‘select * from user;‘)    # 使用execute()方法可以执行SQL语句,执行后的结果会存在缓冲区Out[4]: 4LIn [5]: result1 = cus.fetchone()              # 可以使用fetchone()来查看缓冲区的一条记录In [6]: result2 = cus.fetchmany(3)            # 可以使用fetchmany()来查看缓冲区的多条记录 In [7]: result3 = cus.fetchall()              # 可以使用fetchall()来查看所有的记录

三、根据游标执行 MySQL 事务

#!/usr/bin/env pythonimport MySQLdbdef connect_mysql():    db_config = {        ‘host‘: ‘127.0.0.1‘,        ‘port‘: 3306,        ‘user‘: ‘root‘,        ‘passwd‘: ‘pzk123‘    }    c = MySQLdb.connect(**db_config)    return cif __name__ == ‘__main__‘:    c = connect_mysql()              # 首先连接数据库    cus = c.cursor()                 # 生成游标对象    sql = ‘drop database test;‘      # 定义要执行的SQL语句    try:        cus.execute(sql)             # 执行SQL语句        c.commit()                   # 如果执行成功就提交事务    except Exception as e:         c.rollback()                 # 如果执行失败就回滚事务        raise e    finally:        c.close()                    # 最后记得关闭数据库连接

Python 执行 MySQL 事务

评论关闭