数据库事务管理

事务

事务:是一系列的数据库操作,是数据库应用程序的逻辑单位,即应用程序对数据库的操作都应

该以事务的方式进行。

• 事务是一个操作序列,这些操作“要么都做,要么都不做”。

• 事务定义的语句如下:

(1)BEGIN TRANSACTION:事务开始。

(2)END TRANSACTION:事务结束。

(3)COMMIT:事务提交。该操作表示事务成功地结束,它将通知事务管理器该事务的所有更新操作现在可以被提交或永久地保留。

(4)ROLLBACK:事务回滚。该操作表示事务非成功地结束,它将通知事务管理器出故障了,数据库可能处于不一致状态,该事务的所有更新操作必须回滚或撤销。

 

SQL中事务的开始与结束

  • SQL标准规定当一条SQL语句被执行,就隐式地开始了一个事务,SQL中的Commitwork和Rollback work语句之一会结束一个事务。

(1)Commit work:提交当前事务。这意味着该事务所做的更新在数据库中永久保存。一但事务被提交后,一个新的事务自动开始。

(2)Rollback work:回滚当前事务。这意味着将撤销该事务对数据库的更新。

  • 注意:如果事务已经执行了Commit work,就不能再用Rollback来撤销。

 

事务的特性

  • 事务具4个特性:原子性、一致性、隔离性和持久性。

1、原子性:事务的所有操作在数据库中要么都做要么都不做。

2、一致性:一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而遭受破坏。

3、隔离性:一个事务的执行不能被其他事务干扰。并发事务在执行过程中可能会对同一数据进行操

作,这些事务的操作应该不会相互干扰,是相互隔离的。

4、持久性:一个事务一旦提交,它对数据库的改变必须是永久的,即使系统出现故障也是如此。

 

事务的状态

事务是数据库的基本执行单元,如果事务成功执行,则数据库从一个一致状态进入另一个一致状态。如果因为某种原因事务没能成功执行,但其已经对数据库进行了修改,这时候可能会导致数据库处于不一致的状态,需要对事务已经造成的变更进行撤销(回滚)。

1、活动状态:事务的初始状态,事务执行时处于这个状态。

2、部分提交状态:当操作序列的最后一条语句执行后,事务就处于部分提交状态。

这时,事务虽然已经完全执行,但由于实际输出可能还临时驻留在内存中,在事务

成功完成前还有可能出现硬件故障,因此,部分提交状态并不等于事务成功执行。

3、失败状态:由于硬件或逻辑错误,使得事务不能继续正常执行,事务就进入了失败状态,处于失败状态的事务必须回滚。这样,事务就进入了中止状态。

4、中止状态:事务回滚并且数据库恢复到事务开始执行前的状态。

5、提交状态:当事务成功完成后,称事务处于提交状态。只有事务处于提交状态

后,才能说事务已经提交。

 

事务的状态转换:

BEGIN TRANSACTION:开始运行事务,使事务进入活动状态 • END TRANSACTION:说明事物中的所有读写操作都已完成,使事务进入部分提交状态,把事务的所

有操作对数据库的影响存入数据库。 • COMMIT:标志事务已经成功地完成,事务中的所有操作对数据库的影响已经安全地存入数据库,

事务进入提交状态,结束事务的运行。 • ABORT:标志事务进入失败状态,系统撤销事务中所有操作对数据库和其他事务的影响,结束事务的运行。

数据库的事务调度

事务调度

1、串行调度

是指多个事务依次串行执行,且只有当一个事务的所有操作都执行完成才执行另一个事务的所有操作。

2、并发调度

利用分时的方法同时处理多个事务。


3、可恢复调度

指满足这样的条件的调度:当事务Tj要读事务Ti写的数据时,Ti事务必须要先于事务Tj提交。

并发操作带来的问题

  • 并发操作带来的数据不一致性有三类:丢失修改、不可重复读和脏读数据。

1、丢失修改:两个事务对同一个数据进行修改,导致事务A对数据库的 修改被事务B的修改所覆盖。

2、不可重复读:事务对同一数据进行两次读取的结果不同。原因是两 次读取的间隙数据被另一事务修改了。

3、读脏数据:某事务读取的数据是其它事务修改后的值,但该修改后 来又被撤销了。

 

并发调度的可串行性

  • 多个事务的并发执行是正确的,当且仅当其结果与某一次序串行地执行它们的结果相同,称这种调度策略是可串行化的调度。
  • 可串行性是并发事务正确性的准则。即:一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度。

 

并发控制技术

并发事务如果对数据读写时不加以控制,会破坏事务的隔离性和一致性。为了保持事务的隔离性,系统必须对事务之间的相互作用加以控制,最典型的方式就是加锁。

1、排它锁(Exclusive Locks, 简称X锁):也称为写锁,用于对数据进行写操作时进行锁定。如果事

务T对数据A加上X锁后,就只允许事务T对数据A进行读取和修改,其他事务对数据A不能再加任何锁,

也不能读取和修改数据A,直到事务T释放A上的锁。

2、共享锁(Share Locks, 简称S锁):也称为读锁,用于对数据进行读操作时进行锁定。如果事务T

对数据A加上了S锁后,事务T就只能读数据A但不可以修改,其他事务可以再对数据A加S锁来读取,

只要数据A上有了S锁,任何事务都只能再对其加S锁读取而不能加X锁修改。

 

 例:若事务T1对数据D1已加排它锁,事务T2对数据D2已加共享锁,那么事务T2对数据D1

(1) ;事务T1对数据D2 (2) 。

(1)A.加共享锁成功,加排它锁失败 B.加排它锁成功,加共享锁失败

 C.加共享锁、排它锁都成功 D.加共享锁、排它锁都失败

(2)A.加共享锁成功,加排它锁失败 B.加排它锁成功,加共享锁失败

 C.加共享锁、排它锁都成功 D.加共享锁、排它锁都失败

 

封锁协议

(1)一级封锁协议:是指事务T在修改数据A之前必须先对其加X锁,直到事务结束才释放X锁。解决了丢失修改的问题。

(2)二级封锁协议:是一级封锁协议加上事务T在读取数据A之前必须对其加上S锁,读完后即可释放S锁。解决了读脏数据的问题。

(3)三级封锁协议:是一级封锁协议加上事务T在读取数据A之前必须对其加上S锁,直到事务结束才释放S锁。解决了不可重复读的问题。

 

两段锁协议

  • 两段锁协议(2PL):是指同一事务对任何数据进行读写之前必须对该数据加锁;在释放一个封锁之后,该事务不再申请和获得任何其他封锁。
  • 所谓“两段”的含义是:事务分为两个阶段。第一阶段是获得封锁,也称为扩展阶段。第二阶段是释放封锁,也称为收缩阶段。

例:

 T1:Slock A...Slock B...Xlock C...Unlock B...Unlock A...Unlock C

 T2:Slock A...Unlock A...Slock B...Xlock C...Unlock C...Unlock B

  • 如果事务遵循两段锁协议,那么它们的并发调度是可串行化的。两段锁是可串行化的充分条件,但不是必要条件。即:遵循两段锁协议,一定是可串行化的;不遵循两段锁协议,可能是可串行化的,也可能不是。
  • 注意:采用两段锁协议也有可能产生死锁,这是因为每个事务都不能及时解除被封锁的数据,可能会导致多个事务都要求对方已经封锁的数据而不能继续运行。

 

事务的隔离级别

1、READ UNCOMMITTED(读未提交):最低级别,任何情况都无法保证。

2、READ COMMITTED(读已提交):可避免读脏数据。

3、REPEATABLE READ(可重复读):可避免读脏数据,不可重复读。

4、SERIALIZABLE(串行化):最高级别,可避免读脏数据、不可重复读、幻读。

幻读:事务A查询得到N条数据,然后事务B又插入了M条数据,或者改变了这N条数据之外的M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

posted @ 2022-05-06 23:26  Fancy[love]  阅读(251)  评论(0编辑  收藏  举报