并发控制——数据库事务与封锁协议

 

事务


事务包含四个特性(ACID):原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )

1、原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 。

2、一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

3、隔离性:一个事务的执行不能被其它事务干扰。

4、持续性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
 

并发控制


并发操作有可能带来数据不一致性,数据不一致性包括:丢失修改、不可重复读和读“脏”数据

丢失修改:两个事务T1和T2同时读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。

不可重复读:由于T2的干扰,导致T1前后两次读的数据不一致。

读‘脏’数据:事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时被T1修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。

(不可重复读和读‘脏’数据要分清,两者不同)

并发控制用正确的方式调度并发操作,避免上述问题的产生。常用的并发控制技术有封锁、时间戳、乐观控制法和多版本并发控制等

封锁技术:


封锁包含四种:共享锁(S锁)、排他锁(X锁)、更新锁(U锁)、意向锁

共享锁(S锁) 读锁  :事务T对数据对象A加上S锁,则只允许T读A但不能修改A,其他事务只能再对A加S锁而不能加X锁,直到T释放A上的S锁为止。

排他锁(X锁) 写锁  :事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能在对A加任何类型的锁,直到T释放A上的锁为止。

更新锁(U锁):更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。

意向锁:对多粒度树中的结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。

注:当出现解锁时,就认定解锁任务开始,在解锁阶段不能再加任何锁

封锁协议

一级封锁协议:事务T在修改数据A之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。

二级封锁协议:二级封锁协议是指,在一级封锁协议基础上增加事务T在读数据A之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议出防止了丢失修改,还可以进一步防止读“脏”数据。

三级封锁协议:三级封锁协议是指,在二级封锁协议的基础上增加事务T在读数据A之前必须先对其加S锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还可以进一步防止了不可重复读。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值