事务的基本概念
事务是用户定义的一个数据库操作序列,这些操作序列要么全做要么全都不做,是一个不可分割的工作单位。
事务具有以下特性(ACID特性):
- 原子性
- 一致性
- 隔离性
- 持续性(永久性)
事务通常以BEGIN TRANSACTION(事务开始)语句开始,以COMMIT或ROLLBACK语句结束。
COMMIT称为事务提交语句,表示事务执行成功的结束。
ROLLBACK称为事务回滚语句,表示事务执行不成功的结束,即把事务对数据库的修改进行恢复。
并发操作
在多用户共享系统中,多个用户同时存取同一数据。
(1)并发操作的优点:
增加了处理器和磁盘的可用性,加大事务吞吐量。
(2)并发操作可能带来的问题:
- 丢失更新:T1、T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果。
- 不可重复读:T1读数据后,T2执行更新操作,使T1无法再现前一次读取结果。
- 读脏数据:T1修改数据并写回磁盘,T2读取同一数据后,T1被撤销即数据恢复原值,T2读的数据与DB中的不一致,称为“脏”数据。
封锁是实现并发控制的一个非常重要的技术。
(3)封锁类型
- 排它锁(X锁或写锁)
保证其他事物在T释放A上的锁之前,不能修改A。
- 共享锁(S锁或读锁)
保证其他事物可以读A,但在T释放A上的S锁之前,不能对A做任何修改。
(4)封锁协议
- 一级封锁协议。事物T在修改数据R之前必须对其加X封锁,直到事物结束才释放。一级封锁协议可防止丢失修改,并保证事物T是可恢复的。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
- 二级封锁协议。在一级封锁的基础上,事物读数据的时候加S锁,读取之后释放。二级封锁协议可以防止丢失更新,读脏数据。在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
- 三级封锁协议。一级封锁协议加上事物T在读取数据R之前先对其加S锁,直到事物结束才释放。三级封锁协议可防止丢失修改、防止读“脏”数据,还进一步防止了不可重复读。
- 两段式协议。所有事物必须分为两个阶段对数据项加锁和解锁。其中扩展阶段是在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;收缩阶段是在释放一个封锁之后,事务不能再申请和获得任何其他封锁。