-
mysql事务测试:
关闭自动提交事务,--查看是否自动体骄傲,1表示开启,0表示关闭。 select @@autocommit; 设置关闭:set autocommit =0; 事务四个隔离级别:1-4级别越来越高。 1.read uncommitted --读未提交 2.read committed --读已提交 3.repeatable read --可重复读 4.seariable --序列化执行,串行执行。 产生数据不一致的情况: 脏读,补课重复读,幻读。
-
测试1:脏读(读未提交)read uncommitted;
all:set session transaction isolation level read uncommitted; A:start transaction; A:select * from psn; B:start transaction; B:select * from psn; A:update psn set name='zsk'; A:select * from psn; B:select * from psn;//读取错误,脏读,A事务没有commit,读取到了不存在的数据。 A:commit; B:select * from psn;//正确读取,A事务提交,数据永久修改。
-
测试2:读已提交 read committed
all:set session transaction isolation level read committed; A:start transaction; A:select * from psn; B:start transaction; B:select * from psn; A:update psn set name = 'zs' where id =1; B:select * from psn;//不会产生脏读,督导还是原来值,zsk; A:commit; B:select * from psn;//不可重复读,数据不一致,zs;
-
测试3:可重复读repeatable read
A:set session transaction isolation level repeatable read; B:set session transaction isolation level repeatable read; A:start transaction; A:select * from psn; B:start transaction; B:select * from psn; A:update psn set name='wangwu' where id=3; A:commit;//A执行提交 B:select * from psn;//读不到wangwu,仍为zs,所以可重复读。 B:commit;//B也执行提交。 B:select * from psn;//读取到wangwu; A:start transaction; A:insert into psn vales(4,'s'); B:start transaction; B:insert into psn vales(4,'s');//报错,提示重复逐渐,此时产生幻读。 B:select * from psn;//只有3条数据,没有id为4的,但插不进去。
-
总结:
隔离级别 出现的异常情况 读未提交 脏读 不可重复读 幻读 读已提交 x 不可重复读 幻读 可重复读 x x 幻读 序列化执行 x x x 幻读指的是插入和修改数据的时候,指的是幻读,查询是不会产生。以上学习的是数据库级别的事务,掌握事务隔离级别和数据不一致的情况即可。后续学习声明式事务及事务的传播特性以及分布式事务。