天天看点

事务管理--《数据库系统概念》

术语'事务'指的是构成单一逻辑工作单元的操作的集合。数据库的yiwai事务管理部件使得应用程序开发人员能够把注意力集中在单个事务上,而不必考虑并发和容错等问题。

事务概念

ACID:

  • 原子性(Atomicity):事务的所有操作要么全部执行成功,要么全部执行失败
  • 一致性(Consistency):隔离执行事务时(换言之,在没有事务并发执行的情况下)保持数据库的一致性。
  • 隔离性(Isolation):尽管多个事务并发执行,但系统保证,对于任何一对事务$Ti$和$Tj$,在$Ti$看来,$Tj$要么在$Ti$之前已经开始完成,要么在$Ti$之后开始执行。因此,每个事务都感觉不到系统中有其他事务并发执行。
  • 持久性(Durability):一个事务完成后,它对数据库的改变必须是永久的,即使系统出现故障

调度

事务的执行顺序称之为调度。

当数据库系统并发执行多个事务时,相应的调度不必是串行的。若有两个并发执行的事务,操作系统可能先选择执行其中一个事务的一小段时间,然后切换上下文,执行第二个事务一段时间,接着又切回第一个事务执行一段时间,如此下去。

可串行化

在并发执行中,通过保证所执行的任何调度的效果都与没有并发执行的效果一样,我们可以确保数据库的一致性。也就是说调度应该在某种意义上等价一个串行调度。这种调度成为可串行化。

冲突

当$I$与$J$是不同事务在相同的数据项上的操作指令,并且其中至少有一个是Write指令时,我们说$I$与$J$是冲突的。

等价

设$I$与$J$是调度$S$的两条连续指令。若$I$与$J$是属于不同事务的指令且不冲突,则可以交换$I$与$J$的顺序得到一个新的调度$S'$。$S$与$S'$等价,因为除了$I$与$J$以外,其他指令的次序与原来相同,而$I$与$J$的顺序无关紧要。

冲突等价

如果调度$S$可以经过一系列非冲突指令交换转换成$S'$,我们称$S$与$S'$是冲突等价的。

冲突可串行化

若一个调度$S$与一个串行调度冲突等价,则称调度$S$是冲突可串行化。

调度$S$是否为冲突可串行的,判断其优先图中是否有环,有环则不是冲突可串行的,反之冲突可串行
  • 在$Tj$执行$Read(Q)$之前,$Ti$执行$Write(Q)$。
  • 在$Tj$执行$Write(Q)$之前,$Ti$执行$Read(Q)$。
  • 在$Tj$执行$Write(Q)$之前,$Ti$执行$Write(Q)$。

    如果在优先图中存在边$Ti-->Tj$,则在任何等价$S$的串行调度$S'$中,$Ti$必出现在$Tj$之前。

    事务管理--《数据库系统概念》
    事务管理--《数据库系统概念》

事务的隔离性和原子性

事务隔离性级别

  • 可串行化:顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出

    现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

  • 可重复读:会出现幻读,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁(悲观锁),其它事务无法修改这些数据,就可以实现可重复读了。

    但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读。

    但是MySQL、ORACLE、PostgreSQL等成熟的数据库,出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本并发控制)来实现,通过间隙锁(next-key locking)策略防止幻读的出现。

  • 不可重复读/已提交读:只允许读取已提交数据,但不要求可重复读。比如,在事务两次读取一个数据项期间,另一个事务更新了该数据项并提交。
  • 未提交读:允许读取未提交的数据。这是SQL允许的最低一致性级别。会产生“脏读”

    以上所有隔离性级别均不允许“脏写”,即如果一个数据项已经被另一个尚未提交或中止的事务写入,则不允许对该数据项执行写入操作。