专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
51好读  ›  专栏  ›  OSC开源社区

MySql 两阶段加锁(2PL)协议剖析

OSC开源社区  · 公众号  · 程序员  · 2017-07-20 08:30

正文

请到「今天看啥」查看全文



引入2PL是为了保证事务的隔离性,即多个事务在并发的情况下等同于串行的执行。 在数学上证明了如下的封锁定理:

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

具体的数学推到过程可以参照<>这本书的7.5.8.2节.
此书乃是关于数据库事务的圣经,无需解释(中文翻译虽然晦涩,也能坚持读下去,强烈推荐)


工程实践中的两阶段加锁-S2PL


在实际情况下,SQL是千变万化、条数不定的,数据库很难在事务中判定什么是加锁阶段,什么是解锁阶段。于是引入了S2PL(Strict-2PL),即:

在事务中只有提交(commit)或者回滚(rollback)时才是解锁阶段, 其余时间为加锁阶段。

如下图所示:

这样的话,在实际的数据库中就很容易实现了。


两阶段加锁对性能的影响


上面很好的解释了两阶段加锁,现在我们分析下其对性能的影响。考虑下面两种不同的扣减库存的方案:

由于在同一个事务之内,这几条对数据库的操作应该是等价的。但在两阶段加锁下的性能确是有比较大的差距。两者方案的时序如下图所示:







请到「今天看啥」查看全文