事务的特点
一系列的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
网友评论