数据库中的two phase locking

两段锁协议是指每个事务的执行可以分为两个阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)。
加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。
 
概念
封锁序列
 
 

两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁:

1. 在对任何数据进行读、写操作之前,要申请并获得对该数据的封锁。
2. 每个事务中,所有的封锁请求先于所有的解锁请求。
例如事务T1遵守两段锁协议,其封锁序列是:
Lock A, Read A, A:=A+100, Write A, Lock B, Unlock A, Read B, Unlock B, Commit;[1] 
可以证明,若并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。
另外要注意两段锁协议和防止死锁的一次封锁法的异同之处。一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议;但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。
 
SERIALIZABLE隔离级别可以一次将所有数据加锁
 
 

最新文章

  1. HTML5时代的Web缓存机制
  2. centos安装lxml和pyspider
  3. Mac安装wget的两种方法
  4. python 魔法方法之:__getitem__ __setitem__ __delitem__
  5. php使用mysql扩展库链接mysql数据库(查询)
  6. Java基础---多态、内部类、异常、包
  7. #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。
  8. Dynamics CRM2013 6.1.1.1143版本插件注册器的一个bug
  9. JAVA微信支付接口开发——支付
  10. java_基础_接口和抽象类
  11. 线性表->应用->一元多项式
  12. VBA读写ini 配置文件
  13. JS生成随机数并排序
  14. Codeforces Beta Round #69 (Div. 2 Only)
  15. 从零开始学Kotlin-控制语句(4)
  16. 官方资料&一些好的博客与技术点
  17. 修改npm下载模块的安装位置
  18. Tinkoff Challenge - Elimination Round B. Igor and his way to work(dfs+优化)
  19. HTML5 SSE 数据推送应用开发
  20. php foreach 报 “Cannot create references to elements of a temporary array expression”

热门文章

  1. 浅析/dev/shm
  2. IIS上虚拟站点的web.config与主站点的web.config冲突解决方法 分类: ASP.NET 2015-06-15 14:07 60人阅读 评论(0) 收藏
  3. Python-内置函数小结
  4. html内容超出了div的宽度如何换行让内容自动换行
  5. winform进程、线程、TreeView递归加载
  6. [RESTful]HTTP状态码
  7. Android端简易蓝牙聊天通讯App(原创)
  8. ubuntu14.04禁用自动待机保持屏幕亮度
  9. [翻译] ORMLite document -- Getting Started
  10. 简易版C语言程序语法