标签:增加 隔离 let 需要 exception except 用法 any 用户
一、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 MySQLdb In [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]: 4L In [5]: result1 = cus.fetchone() # 可以使用fetchone()来查看缓冲区的一条记录 In [6]: result2 = cus.fetchmany(3) # 可以使用fetchmany()来查看缓冲区的多条记录 In [7]: result3 = cus.fetchall() # 可以使用fetchall()来查看所有的记录
三、根据游标执行 MySQL 事务
#!/usr/bin/env python import MySQLdb def connect_mysql(): db_config = { ‘host‘: ‘127.0.0.1‘, ‘port‘: 3306, ‘user‘: ‘root‘, ‘passwd‘: ‘pzk123‘ } c = MySQLdb.connect(**db_config) return c if __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() # 最后记得关闭数据库连接
标签:增加 隔离 let 需要 exception except 用法 any 用户
原文地址:http://www.cnblogs.com/pzk7788/p/7875234.html