事务并发控制(一)

1、事务的概念

    事务是用户定义的一组数据库操作序列。

    事务具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。

    原子性指:事务包含的所有操作要么全部被执行,要么都不执行;一致性指:事务的执行结果必须使数据库从一个一致性状态转换到另一个一致性状态,一致性状态是指数据库中的数据满足完整性约束;隔离性是指:在事务被提交以前,其操作结果对于其他事务不可见;持续性指:一旦事务提交成功,其对数据库中数据的改变是永久的,即使因数据库故障而受到破坏,DBMS也能恢复。

     对于事务的一致性,有点不好理解。事务的一致性的另一个定义如下:   

     事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。事务的执行结果将使数据库从一个一致性状态到另一个一致性状态。然而,事务并发会导致数据库状态的不一致性,即使各个事务能保持状态的正确性。保证并发执行的事务能保持数据库一致性的整个过程成为并发控制。

2、事务并发所产生的问题

事务并发执行时,如果不对事务执行顺序进行限制,造成数据库处于不一致的状态。多个事务并发执行时,数据的不一致性主要表现为:数据更新丢失、“脏“读和不一致读。

2.1 数据更新丢失

指两个或者多个事务并发执行时,都对同一数据进行更新操作(即先读后改,再写入),从而导致后面的更新覆盖前面的更新。例如,两个事务T1和T2同时读入同一数据并修改,T2的提交覆盖了T1的提交结果,导致T1的修改丢失(此时,没有对T1,T2的执行顺序做控制)。由于这种情况是事务写造成的,因此也被叫做写-写冲突(Write-Write冲突)。

       另外更新丢失也被分为两类:

第一类更新丢失(回滚丢失 ) :

     当2个事务更新相同的数据源,如果第一个事务被提交,而另外一个事务却被撤销,那么会连同第一个事务所做的跟新也被撤销。也就是说第一个事务做的跟新丢失了。

第二类更新丢失(覆盖丢失):

    第二类更新丢失是在实际应用中经常遇到的并发问题,它和不可重复读本质上是同一类并发问题,通常它被看做不可重复读的特例:当2个或者多个事务查询同样的记录然后各自基于最初的查询结果更新该行时,会造成第二类丢失更新。因为每个事务都不知道不知道其他事务的存在,最后一个事务对记录做的修改将覆盖其他事务对该记录做的已提交的修改

2.2 读“脏”数据

读“脏”数据是由于一个事务正在读另一个更新事务尚未提交的数据引起的。这种不一致的情况又被成为读-写冲突(Read-Write冲突)。例如,事务T1修改了某数据,事务T2在T1未提交之前读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致了,则称T2读到的数据为“脏”数据。如下图所示。

                                       图2.1 脏读示意图

2.3 不一致读

不一致读,也叫做不可重复读,分三种情况。

  1. 对于并发执行的两个事务T1,T2,当事务T1读取某一数据后,事务T2对该数据执行了更新操作,使得T1无法再次读取该数据时,无法获得跟前一次相同的结果。例如,T1读取数据A后,T2修改了数据A,T1再次读取数据A,却得到不同的结果。
  2. 事务T1按一定条件读取某些数据记录后,事务T2插入了一些记录,T1再次以相同条件读取记录时得到不同的结果集。
  3. 事务T1按照一定条件读取某些记录后,事务T2删除了其中的一些记录,T1再次以相同条件读取记录时得到不同的结果集。

第2、第3种情况又称为“幻读”,即事务前后两次读取按照同一条件读取数据库,却得到不同的结果集,仿佛出现了幻觉一样。不一致读也是由读-写冲突引起的。

 

 

如有意见不同或者需要讨论,请联系QQ:609400870

猜你喜欢

转载自blog.csdn.net/songguangfan/article/details/86499196