什么是事务
事务是逻辑上的一组操作,要么都成功,要么都失败
为什么需要事务
很多时候一个数据操作,不是一个sql语句就完成的,可能有很多个sql语句,如果部分sql执行成功而部分sql执行失败将导致数据错乱!
例如转账操作,
1.从原有账户减去转账金额
2.给目标账户加上转账金额
若中间突然断电了或系统崩溃了,钱就不翼而飞了!
使用事务
start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库
commit;--提交事务,让这个事物中的sql立即执行数据的操作,
rollback;--回滚事务,取消这个事物,这个事物不会对数据库中的数据产生任何影响
案例:转账过程中发生异常
#准备数据 create table account( id int primary key auto_increment, name varchar(20), money double ); insert into account values(1,'赵大儿子',1000); insert into account values(2,'刘大牛',1000); insert into account values(3,'猪头三',1000); insert into account values(4,'王进',1000); insert into account values(5,'黄卉',1000);
#使用事务在mysql使用,正确在执行,再提交。
回滚
python事务的体现
python的pymysql模块中一切代码其实都是在事务的前提下实行的,所以才有commit和rollback的功能。
import pymysql conn = pymysql.connect( user = "root", password = "root", database = "day48" ) #创建游标 cur = conn.cursor(pymysql.cursors.DictCursor) sql1 = "update account set money = money-100 where id = 2" sql2 = "update account set moneys = money +100 where id = 1" try: cur.execute(sql1) cur.execute(sql2) conn.commit() print("修改成功") except Exception: conn.rollback() print("修改失败")
结果:修改失败
注意:事务的回滚的前提是能捕捉到异常,否则无法决定何时回滚,Python中很简单就实现了,另外mysql中需要使用存储过程才能捕获异常!
事务的四个特性:
原子性:
事务是一组不可分割的单位,要么同时成功,要么同时不成功。
一致性:
事务前后的数据完整性应该保持一致,(数据库的完整性:如果数据库在某一个时间点先,所有数据都符合所有约束,则称数据库为完整性的状态)
隔离性:
事务的隔离性是多个用户并发访问数据时,一个用户的事务不能被其他的用户的事务所干扰,多个并发事务之间数据要相互隔离
持久性
持久性是指一个事务一旦被提交,它对数据的改变就是永久的,接下来即使数据库发生故障也不应该对其有影响。
事务对用户的隔离级别
数据库使用者可以控制数据库工作在哪个级别下,就可与防止不同的隔离性问题
read uncommitted --不做任何隔离,可能脏读,幻读
read committed----可以防止脏读,不能防止不可重复读,和幻读,
Repeatable read --可以防止脏读,不可重复读,不能防止幻读
Serializable--数据库运行在串行化实现,所有问题都没有,就是性能低
修改隔离级别:
select @@tx_isolation;--查询当前级别
set[session|global] transaction isolation level .... ;修改级别
实例:
set global transaction isolation level Repeatable read ;