前言
这次课给大家介绍三大现象有脏读现象,不可重复读,与幻像现象。同时给大家介绍四种隔离水平,并且如何设置隔离级别
一、三大现象
脏读现象
读取操作可以访问脏数据,即由未提交的事务写入的数据,如下图所示,步骤二的事务并没有提交。
不可重复的读取现象
单个事务对同一数据的不同读取将是不可重复的,即它们可能返回不同的值,如下图所示,一开始查询预算为2000,最后查询预算变成了3000。我们可以看到前后数据内容不一致的现象。
幻象想象(Phantom phenomenon)
这个概念可能有点不好理解,事务读取一次的一组行可能与事务尝试再次读取时的一组行不同。简单来说就是前面读取的数据数量跟后面不一样,🧨🧨🧨注意是数据的数量,而不是内容!如下图所示:
二、隔离水平
SQL的ANSI标准为数据库事务的处理提供了四个级别的隔离,隔离级别是根据几种可能的现象或奇怪难以解释的操作发生来定义的。
四种隔离等级:
- 读取未提交(READ UNCOMMITTED)
在读取未提交的隔离级别,事务可能显示:脏读现象,不可重复读现象,幻象现象 - 读取已提交(READ COMMITTED)
在读取已提交的隔离级别,事务可能显示:不可重复读现象,幻象现象 - 可重复读取(REPEATABLE READ)
在可重复读取的隔离级别,事务可能显示:幻象现象 - 可序列化的(SERIALIZABLE)
在可序列化的隔离级别,事务不会显示任何现象
三、设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
可序列化隔离级别
这里的单独说一下可序列化隔离级别,如果运行在可序列化隔离级别上的事务T,如果开始尝试更新或删除进行的事务T,那么系统将中止事务T。
如果一个可序列化的事务失败,则可以:
(1)提交迄今为止已处理的工作
(2)处理附加的(但不同的)语句
(3)回滚整个事务
参考文献
Elmasri R., Navathe S., Fundamentals of Database Systems, 6th edition, chapter 21.6 Transaction Support in SQL, pp. 774-776