这次课给大家介绍三大现象有脏读现象,不可重复读,与幻像现象。同时给大家介绍四种隔离水平,并且如何设置隔离级别
读取操作可以访问脏数据,即由未提交的事务写入的数据,如下图所示,步骤二的事务并没有提交。
单个事务对同一数据的不同读取将是不可重复的,即它们可能返回不同的值,如下图所示,一开始查询预算为2000,最后查询预算变成了3000。我们可以看到前后数据内容不一致的现象。
这个概念可能有点不好理解,事务读取一次的一组行可能与事务尝试再次读取时的一组行不同。简单来说就是前面读取的数据数量跟后面不一样,注意是数据的数量,而不是内容!如下图所示:
SQL的ANSI标准为数据库事务的处理提供了四个级别的隔离,隔离级别是根据几种可能的现象或奇怪难以解释的操作发生来定义的。
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