作家
登录

MySQL的两阶段加锁协议

作者: 来源: 2017-08-31 10:39:21 阅读 我要评论

#MySql-两阶段加锁协定 ##媒介此篇博客主如果讲述MySql(仅限innodb)的两阶段加锁(2PL)协定,而非两阶段提交(2PC)协定,差别如下:

  • 2PL,两阶段加锁协定:重要用于单机事务中的一致性与隔离性。
  • 2PC,两阶段提交协定:重要用于分布式事务。

MySql本身针对机能,还有一个MVCC(多版本控制)控制,本文不推敲此种技巧,仅仅推敲MySql本身的加锁协定。 ##什么时刻会加锁在对记录更新操作或者(select for update、lock in share model)时,会对记录加锁(有共享锁、排它锁、意向锁、gap锁、nextkey锁等等),本文为了简单推敲,不推敲锁的种类。 ##什么是两阶段加锁在一个事务琅绫擎,分为加锁(lock)阶段和解锁(unlock)阶段,也即所有的lock操作都在unlock操作之前,如下图所示:

##为什么须要两阶段加锁

大年夜膳绫擎的例子中,可以看出,须要把最热点的记录,

惹人2PL是为了包管事务的隔离性,即多个事务在并发的情况劣等同于串行的履行。 在数学上证清楚明了如下的封锁定理:

如不雅事务是良构的且是两阶段的,那么任何一个合法的调剂都是隔离的。

具体的数学推到过程可以参照<<事务处理:概念与技巧>>这本书的7.5.8.2节.

此书乃是关于数据库事务的圣经,无需解释(中文翻译固然晦涩,也能保持读下去,强烈推荐)

##工程实践中的两阶段加锁-S2PL 在实际情况下,SQL是千变万化、条数不定的,数据库很难在事务中剖断什么是加锁阶段,什么是解锁阶段。于是惹人了S2PL(Strict-2PL),即:

如下图所示:

如许的话,在实际的数据库中就很轻易实现了。 ##两阶段加锁对机能的影响

膳绫擎很好的说清楚明了两阶段加锁,如今我们分析下其对机能的影响。推敲下面两种不合的扣减库存的筹划:

(具体的锁类型较为复杂,不在这琅绫氰述),所以两者效不雅一样。

筹划1:

  1. begin
  2. // 扣减库存 
  3. update t_inventory set count=count-5 where id=${id} and count >= 5; 
  4. // 锁住用户账户表 
  5. select * from t_user_account where user_id=123 for update
  6. // 插入订单记录 
  7. insert into t_trans; 
  8. commit 

筹划2:

  1. begin
  2.  
  3. // 锁住用户账户表 
  4.  
  5. select * from t_user_account where user_id=123 for update
  6.  
  7. // 插入订单记录 
  8.  
  9. insert into t_trans; 
  10.  
  11. // 扣减库存 
  12.  
  13. update t_inventory set count=count-5 where id=${id} and count >= 5; 
  14.  
  15. commit 

因为在同一个事务之内,这几条对数据库的操作应当是等价的。但在两阶段加锁下的机能确是有比较大年夜的差距。两者筹划的时序如下图所示:


  推荐阅读

  Linux程序设计的一些优化措施

这些常识是在平常的浏览中,零碎的获得的,本身总结了一下,分享在这里全局变量VS函数参数i=i+1; i++; i--; 这三个语句都平日引用在for()或者是while()里边,大年夜履行效力上来说 3》2》1这和最毕生成的汇编说话有>>>详细阅读


本文标题:MySQL的两阶段加锁协议

地址:http://www.17bianji.com/lsqh/37039.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)