数据库中的封锁协议
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
并发产生的数据不一致有:丢失修改,读脏数据,不可重复读
两种锁:S锁(共享锁,读锁),X锁(排它锁,写锁)
加S锁后,本事务就只能读取数据而不能修改。
其他事务可以加S锁来读取数据,但不能加X锁修改数据。
即:只要数据上有S锁,任何事务都只能再对其加S锁读取,而不能加X锁修改。
加X锁后,本事务可以读取和修改数据。
其他事务不能加任何锁,从而也不能读取和修改数据。
封锁协议有:三级封锁协议以及两段锁协议
一级封锁协议:写数据前加X锁,事务结束释放X锁。
解决丢失修改问题。
二级封锁协议:一级之上,读数据前加S锁,读完释放S锁。
一级之上解决读脏数据问题。
三级封锁协议:二级之上,事务结束才释放S锁。
二级之上解决不可重复读问题。
两段锁协议(2PL):读数据前加S锁,写数据前加X锁,事务结束时才释放。
当要修改数据时,事务应对已加的S锁升级为X锁。
事务释放一个封锁后,不再申请其它任何封锁。
即一个事务如果对不同数据加锁,解锁都是放到后面一块儿进行的。
注意,以前一直弄错,这儿是一个事务,如果是并发事务,A事务的解锁可以放到B事务之前。
两段锁协议解决的是事务并发时的正确调度,并不能解决死锁。
注意:如果两个事务都对同一数据有读和写,那么可以不加S锁,直接上X锁。