数据库基础4—事务管理,并发处理

数据并发的问题 

    一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库。数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会 导致各种并发问题,破坏数据的完整性。

这些问题可以归结为5类,包括3类数据读问题(脏读、幻象读和不可重复读)以及2类数据更新问题(第一类丢失更新和 第二类丢失更新)。下面,我们分别通过实例讲解引发问题的场景。


脏读(dirty read)  
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。来看取款事务和转账事务并发时引发的脏读场景:
     
时间
转账事务A
取款事务B
T1 开始事务
T2开始事务 
T3 查询账户余额为1000元    
T4 取出500元把余额改为500元
T5查询账户余额为500元(脏读) 
T6 撤销事务余额恢复为1000元
T7汇入100元把余额改为600元 
T8提交事务 
 
    在这个场景中,B希望取款500元而后又撤销了动作,而A往相同的账户中转账100元,就因为A事务读取了B事务尚未提交的数据,因而造成账户白白丢失了500元。

不可重复读(unrepeatable read) 
   不可重复读是指A事务读取了B事务已经提交的更改数据。假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致:
 
时间
取款事务A
转账事务B
T1 开始事务
T2开始事务 
T3 查询账户余额为1000元     
T4查询账户余额为1000元 
T5 取出100元把余额改为900元
T6 提交事务                  
T7查询账户余额为900元(和T4读取的不一致) 
 
  在同一事务中,T4时间点和T7时间点读取账户存款余额不一样。

幻象读(phantom read) 

    A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题。幻象读一般发生在计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,

两 次统计存款账户的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时,两次统计的总金额将不一致:  

时间
统计金额事务A
转账事务B
T1 开始事务
T2开始事务 
T3统计总存款数为10000元 
T4 新增一个存款账户,存款为100元
T5 提交事务     
T6再次统计总存款数为10100元(幻象读) 

    如果新增数据刚好满足事务的查询条件,这个新数据就进入了事务的视野,因而产生了两个统计不一致的情况。 

幻象读和不可重复读是 两个容易混淆的概念,前者是指读到了其它已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除)

第一类丢失更新 
    A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来: 
    

时间
取款事务A
转账事务B
T1开始事务 
T2 开始事务
T3查询账户余额为1000元     
T4 查询账户余额为1000元
T5 汇入100元把余额改为1100元
T6 提交事务
T7取出100元把余额改为900元 
T8撤销事务 
T9余额恢复为1000元(丢失更新) 

A事务在撤销时,“不小心”将B事务已经转入账户的金额给抹去了。 
 第二类丢失更新 
A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失:  
时间
转账事务A
取款事务B
T1 开始事务
T2开始事务 
T3 查询账户余额为1000元    
T4查询账户余额为1000元 
T5 取出100元把余额改为900元
T6 提交事务           
T7汇入100元 
T8提交事务 
T9把余额改为1100元(丢失更新) 

    上面的例子里由于支票转账事务覆盖了取款事务对存款余额所做的更新,导致银行最后损失了100元,相反如果转账事务先提交,那么用户账户将损失100元。


以上都是分析了一些数据库并行操作时可能出现的一些问题

首先讨论可恢复的调度是怎么样的:

(1)对于没对事务X和Y,如果Y读取了X所写的数据项,那么X一定要先于Y提交

时间
X
Y
T1 READ(A) 
T2WRITE(A) 
T3 READ(A)  
T4  
T5 提交
 READ(B)  
   
Y读取了X写入的数据A,并且Y先于X提交,但是X出现故障回滚,那么Y的数据A不正确了,所以X必须先于Y提交

(2)因为级联关系出现后,如果需要回滚,会出现级联回滚的情况,我们并不希望这样。对于事务X,Y,如果Y读取了

X写的数据项,X必须在Y读取前提交,防止X出现回滚时,牵连到Y

基于封锁的并发控制

共享锁  可读数据,不可写  S

排它锁 可以读数据,可以写数据   X

         S             X                        相容矩阵

S     TRUE       FLASE

X      FLASE    FLASE

两段封锁协议

1增长阶段 : 事务可以获得锁,不能释放锁

2 缩减阶段:事务可以释放锁,不能获得新的锁

两段协议可以保证调度的可串行化,但是并不能保证不会死锁,解除的方式是检测等待图中的环,选出发生死锁的环,进行回滚




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值