事务的总结

事务特性: ①原子性:要么都成功,要么都失败,回滚。②一致性 ③隔离性 ④持久性。

事务并发问题

① 脏读:一个事务读取了另一个事务未提交的数据。

② 不可重复读:一个事务多次查询却返回了不同的结果。这是由于在查询间隔,另一事务修改了数据并进行了提交。强调 读–读。

③ 幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的数据。例如:select某记录是否存在,不存在,准备插入此纪录,但执行insert时发现该记录已经存在,无法插入,此时就发生了幻读。强调 读–写。

事务隔离级别

① READ-UNCOMMITTED (读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

② READ-COMMITTED (读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

③ REPEATABLE-READ (可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

④ SERIALIZABLE (可串行化): 最高的隔离级别,完全服从ACID原则。所有的事务依次逐个执行,事务间完全互不干扰,可以防止脏读、不可重复读以及幻读。

Mysql 默认采用的 REPEATABLE_READ (可重复读)隔离级别。 事务隔离机制的实现基于锁机制和并发调度。 其中并发调度使用的是MVCC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。

++MVCC++
主要为了提高数据库并发性能,处理读写冲突问题。

原理:通过保存数据在某个时间点的快照来实现的。也就是说不管要执行多长时间,每个事务看到的数据都是一致的。

MVCC可以解决脏读、不可重复读、部分幻读问题。