所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全都不做,是一个不可分割的单元。
四个特性
原子性(Atomicity):事务中包括的诸多操作要么都做,要么都不做。
一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态到另一个一致性状态,因此当数据库只包含成功事务提交的结果的时候就称数据库处于一致性状态。如果数据库运行过程中发生故障,导致某些正在运行的事务被迫中断,这些被迫中断的事务对数据库所做的修改有部分已经写入物理数据库,那么此时数据库就处于不一致的状态。(分布式系统中就存在数据一致性的问题),可以通过一致性条件来判断数据是否一致。
隔离性(Isolation):一个事务的执行不能被其他并发执行的事务所影响,也就是说一个事务内部的操作以及使用的数据对其他事务是不可见的,并发的各个事务之间不能相互干扰。
持续性(Durability):指一个事务一旦提交之后,他对数据库中数据的改变就应该是永久性的,接下来的其他操作或者故障都不应该对其执行结果有何影响。
并发控制
数据库是一种共享的资源,允许事务并发的执行,在单处理器系统中,事务的并发执行实际上是事务的并发操作轮流交叉执行,这种并行执行方式称为交叉并发方式,虽然事务并没有真正的并行运行,但是这样做确实提高了处理器的执行效率,减少空闲时间,多处理器系统中,每个处理器可以单独运行一个事务,多个处理器可以同时运行多个事务,实现真正的并行运行,这种并行执行称为同时并发方式。本文讨论的并发控制技术是以但处理其系统为基础的,因为此理论可以平行运用到多处理器系统中。
当多个事务同时存取某一数据时就产生了并发的操作,若对并发操作不加以控制就会产生诸如存取和存储的数据不正确的问题,影响数据库中数据的正确性和事务的一致性。为了保证事务的一致性和隔离性,数据库系统必须提供并发操作控制机制,对并发操作进行正确的调度,这就是数据库中并发控制机制的责任。
下面看看并发操作带来的那些数据的不一致性问题。
考虑飞机订票系统中的一个操作活动序列 (1)甲售票点(甲事务)读出某航班机票余额为A=16; (2) 乙售票点(乙事务)读出同一航班的机票余额也为A=16; (3)甲售票点卖出一张机票,A=A-1,将A=15写回数据库; (4) 乙售票点同时也售出一张机票,A=A-1,将A=15写回数据库; 结果明明卖出两张机票,数据库中机票余额只减少1,这种情况称为数据库的不一致性。这种不一致性是由并发操作引起的。在并发操作情况下,对甲、乙两个事务的操作序列的调度是随机的。若按上面的调度序列执行了,甲事务的 修改就被丢失,这是由于第4步中乙事务修改A并写回后覆盖了甲事务的修改。
记事务为T.....n,读数据x为R(x),写数据为W(x);下图示范了并发操作中的三种数据不一致性问题。
(1) 丢失修改 两个事务T1,T2同时读取同一数据并修改,T2提交的数据覆盖了T1提交的数据,导致T1的数据丢失了。
(2) 不可重复读 指T1读取了数据后,T2对数据进行了更新操作,使得T1无法重现之前的数据,导致两次读取的数据不一致。具体的讲不可重复读分为三种情况:
>> T1读取了数据后,T2对数据进行了更新操作,使得T1无法重现之前的数据,导致两次读取的数据不一致
>> 事务T1读取了某些数据,之后T2删除了一些数据,T1再回来读取数据的时候发现某些数据神秘的消失了
>> 事务T1读取了某些数据,之后T2插入了一些数据,当T1再来读取这些数据的时候发现多出来一些数据。
后面两种不可重复读有时也成为 “幻读” (Phantom Row)
(3) 读脏数据
读脏数据指的是T1对某些数据做了修改之后将数据提交到数据库,然后T2去读取了这些数据,再然后T1由于某些原因将之前事务所做的操作回滚了,那么此时数据库中的数据回到了最初的状态,T2就出现了读到脏数据的情况。
产生上述三种不一致性的原因就是事务的并发操作破坏了事务的隔离性。并发控制就是要正确的调度并发的事务操作。使得一个事务的执行不受别的事务的影响。
解决方案会在后面的事务的ACID特性以及并发操作控制(二)中给出