【MySQL入门】之细说脏读、幻读及不可重复读

【MySQL入门】之细说脏读、幻读及不可重复读

一、事务的基本要素(ACID)

ACID原则是数据库事务正常执行的四个基本要素,分别指原子性、一致性、隔离性及持久性。

原子性(Atomicity)是指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了,比如A转账给B 100元,这个事务可以分成两个步骤:第一步A账户扣除100元,第二步B账户增加100元。不可能出现A账户扣钱,而B账户未增加钱的情况,这两步必须同时完成,任何一步出现问题整个事务就会回滚。

一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性。事务开始之前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。数据库一致性的定义是由用户负责的。例如,上面的例子中,A和B的账户金额之和在转账前后要保持不变。

隔离性(Isolation):事务的隔离性,是指两个以上的事务不会出现交错执行的状态,因为这样可能会导致数据不一致。

持久性(Durability):一旦事务提交或者回滚,这个状态都要持久化到数据库中。

二、事务的提交和回滚

#事务的提交
mysql> start transaction;#手动开启事务
mysql> insert into t_test(name) values(‘jack’);
mysql> commit;#commit代表事务提交
mysql> select * from t_test;
+----+------+
| id | name |
+----+------+
| 1  | herry|
| 2  | jack |
+----+------+
2 rows in set (0.00 sec)
#事务的回滚
mysql> start transaction;#手动开启事务
mysql> insert into t_test(name) values(‘jack’);
mysql> rollback;#代表事务回滚
mysql> select * from t_test;
+----+------+
| id | name |
+----+------+
|  1 | herry|
+----+------+
1 rows in set (0.00 sec)

三、数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。

隔离级别
脏读
不可重复读
幻读
读未提交(Read uncommitted)
可能
可能
可能
读已提交(Read committed)
不可能
可能
可能
可重复读(Repeatable read)
不可能
不可能
可能
序列化(Serializable)
不可能
不可能
不可能

1. Read UnCommitted(读未提交)

最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。生产环境不建议使用。

2. Read Committed(读提交)

一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。这种情况也叫不可重复读,允许幻读的发生,是oracle数据库的默认隔离级别。

3. Repeatable Read(重复读)

mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。避免了脏读、不可重复读和幻读的发生。

4. Serializable(序列化)

最高隔离级别。所有事务操作依次顺序执行。会导致大量的超时以及锁竞争,同时导致并发度下降,性能最差。不建议生产使用。

四、不同事务级别带来的并发问题

1.脏读

脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。
【MySQL入门】之细说脏读、幻读及不可重复读

如上图所示,t3时刻,事务A读取到了事务B累加5但是还未提交的a值,且在t3时刻,事务B回滚了,那么事务A基于t3时刻的查询所做的操作就会出现问题。

2.不可重复读

事务A前后读取到的数据不一致。
【MySQL入门】之细说脏读、幻读及不可重复读

如上图所示,事务A在t2时刻读取到a的值,和t4时刻读取到的a的值不一致,因为事务B在t3时刻对a值进行了更新并提交

3.幻读

幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一次查询不相同。
【MySQL入门】之细说脏读、幻读及不可重复读

如上图所示,事务A在t2时刻和t4时刻获取到的数据条数不一致,因为事务B在t3时刻新增了一条符合事务A查询条件的数据并提交了,事务A像是出现了幻觉一样。

五、总结

今天我们主要一起学习了事务的特性、隔离级别以及不同隔离级别会引发的问题。事务的这些特性主要是通过日志技术、锁技术以及MVCC(多版本并发控制)来一起实现的,后面我们会逐一掀起它们的盖头来。

【MySQL入门】之细说脏读、幻读及不可重复读

上一篇:关于pgsql删除表中重复记录的办法


下一篇:MySQL-忘记密码