#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:begin;
// 扣减库存
updatet_inventorysetcount=count-5whereid=${id}andcount>= 5;
// 锁住用户账户表
select*fromt_user_accountwhereuser_id=123forupdate;
// 插入订单记录
insertintot_trans;
commit;
筹划2:begin;
// 锁住用户账户表
select*fromt_user_accountwhereuser_id=123forupdate;
// 插入订单记录
insertintot_trans;
// 扣减库存
updatet_inventorysetcount=count-5whereid=${id}andcount>= 5;
commit;
因为在同一个事务之内,这几条对数据库的操作应当是等价的。但在两阶段加锁下的机能确是有比较大年夜的差距。两者筹划的时序如下图所示:
推荐阅读
这些常识是在平常的浏览中,零碎的获得的,本身总结了一下,分享在这里全局变量VS函数参数i=i+1; i++; i--; 这三个语句都平日引用在for()或者是while()里边,大年夜履行效力上来说 3》2》1这和最毕生成的汇编说话有>>>详细阅读
地址:http://www.17bianji.com/lsqh/37039.html