四大隔离级别,以及不可重复读和幻影读的出现原因。
一、并发一致性问题
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。
丢失修改
丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。
读脏数据
读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。
不可重复读
不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致。
幻影读
幻读本质上也属于不可重复读的情况,T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
产生并发不一致性问题的主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
二、隔离级别
-
未提交读(READ UNCOMMITTED)
- 事务中的修改,即使没有提交,对其它事务也是可见的。
-
提交读(READ COMMITTED)
- 一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
-
可重复读(REPEATABLE READ)
- 保证在同一个事务中多次读取同一个数据的结果是一样的。
-
可串行化(SERIALIAZABLE)
- 强调事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。
- 该隔离级别需要加锁实现,因为要使用加锁机制保证同一时间只有一个事务执行,也就是保证事务串行执行。
隔离级别能解决的并发一致性问题
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
未提交读 | 1 | 1 | 1 |
提交读 | 0 | 1 | 1 |
可重复读 | 0 | 0 | 1 |
串行化 | 0 | 0 | 0 |