mysql 二段锁_MySQL的两阶段加锁协议

#MySql-两阶段加锁协定 ##媒介此篇博客主如果讲述MySql(仅限innodb)的两阶段加锁(2PL)协定,而非两阶段提交(2PC)协定,差别如下:2PL,两阶段加锁协定:重要用于单机事务中的一致性与隔离性。

2PC,两阶段提交协定:重要用于分布式事务。

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

260e1d93f747a87ef6635e4e1803a1cf.png-wh_651x-s_2384315828.png

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

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

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

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

具体的数学推到过程可以参照<>这本书的7.5.8.2节.

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

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

如下图所示:

5079c03623f2d7763639c643ae4ff29e.png

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

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

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

筹划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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值