事务并发控制(一)

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

 

3、数据库的四种隔离级别

ISO标准定义了4个事务隔离等级,即

READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

1) READ UNCOMMITTED(可以读未提交的)

 查询可以读取到其他事务正在修改的数据,即使其他事务的修改还没有提交.这种隔离等级无法避免脏读.

2) READ COMMITTED(只可以读已经提交的)

其他事务对数据库的修改,只要已经提交,其修改的结果就是可见的,与这两个事务开始的先后顺序无关.这种隔离等级避免了脏读,但是无法实现可重复读,甚至有可能产生幻读.

3) REPEATABLE READ(可重复读)

该隔离级别要求事务只能读取在它开始之前已经提交的事务对数据库的修改,在它开始以后,所有其他事务对数据库的修改对它来说均不可见.从而实现了可重复读,但是仍有可能幻读。该隔离界别下,事务会锁定查询中使用的所有数据以防止其他用户更新,但其他用户可以将新的幻像行插入数据集,且幻想行包括在当前事务后续读取中。

4) SERIALIZABLE(可串行化)

这是事务隔离等级的最高级别.其实现原理就是对于所有的query,即使是查询,也会加上读锁,避免其他事务对数据的修改.所以它成功的避免了幻读.但是代价是,数据库系统的并发处理能力大大降低,所以它不会被用到生产系统中。

创建了一个技术闲聊群:有兴趣可加我微信,拉你一起讨论杂七杂八的技术,虽然大家都不怎么活跃!
加好友备注:你的博客名 && 随便给我的任意文章点个赞或留言

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神技圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值