什么是事务,有什么用

2022-03-21  本文已影响0人  MobotStone

事务的特点

一系列的DML操作(不可分割):增删改查--crud

事务隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交 (read-uncommitted)
读已提交 (read-committed) 不会
不可重复读 (repeatable-read) 不会 不会
串行化 (serializable) 不会 不会 不会

1. 脏读

一个事务读取了另外一个事务未提交的数据,就是脏读。

事务1: A给B转账500,但是事务未提交。
事务2: B查看了账户,发现A转过来500,本来只转300过来就好,发现多转了200,心里美滋滋。。。
事务1: A及时发现多转了200,修改了转300,提交事务。

若避开脏读,可以设置隔离级别为Read committed

2. 不可重复读

一个事务先后读取同一条记录,而事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,这种就是不可重复读。不可重复读侧重于修改

事务1:B去买东西,卡里有500块钱,消费100,还没提交事务。
事务2:B的老婆把B的500块钱转出去了,已提交事务。
事务1:B此时提交事务,支付不了。再次读取发现卡里没钱支付。

若避开不可重复读,可以设置隔离级别为Repeatable read

3.幻读

一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。Mysql的默认隔离级别为Repeatable read,可以避免不可重复读,但是可能出现幻读的情况。侧重于新增或删除

事务1:B的老婆查看B的卡消费记录,目前共消费了500元。
事务2:B此时刚在外面请朋友吃完饭,付款了100,事务已提交。
B的老婆决定把账单打印出来,晚上跟B对账,却发现打印出来的消费为600元。她刚才明明看到是500,怎么是600,难道是幻觉?

那么可以将隔离级别设置为最高级的Serializable

上一篇下一篇

猜你喜欢

热点阅读