行锁就是针对数据表中记录的锁,比如事务A更新了一行,而这时候事务B也要更新一行,则必须等事务A的操作完成后才能进行更新。
举个栗子
假设ID是表T的主键
实际上事务B的update语句会被阻塞,直到事务A执行commit之后,事务B才能继续执行。所以A持有的两个记录的行锁,都是在commit的时候才释放的。
在InnoDB事务中,行锁是在需要的时候才加上的,但是并不是不需要了就立刻释放,而是要要等到事务结束的时候才释放,这个就是两阶段锁协议。
假如你的事务中需要锁多个行,要把最可能造成冲突,最可能影响并发度的锁尽量往后放。
假设你负责实现一个电影票在线交易业务,顾客A要在影院B购买电影票,这个业务要设计一下操作:
1 从顾客A账户余额扣除电影票价
2 给电影院B账户增加这张电影票价
3 记录一天交易日志
上面我们需要更新两条记录,并insert一条记录,当然,为了保证原子性,我们要把这个三个操作放在一个事务中,你会怎样安排三个语句在事务中的顺序呢?
如果同时有另外一个顾客C要在影院B买票,那么两个事务冲突的部分就是语句2了,因为它们要 更新同一个影院的账户余额,需要修改同一行数据。
根据两阶段协议,不论你怎样安排语句顺序,所有的操作需要的行锁都是在事务提交的时候才释放的,所以如果你把语句2安排在最后,比如按照3,1,2(第6条)这样的顺序,那么影院账户余额这一行的锁时间最少,这就最大程度的减少了事务之间额锁等待,提升了并发度。
文章转载自小胡的博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3063次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
863次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
509次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
444次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
317次阅读
2025-04-30 17:37:37
SQL优化 - explain查看SQL执行计划(下)
金同学
288次阅读
2025-05-06 14:40:00
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
285次阅读
2025-04-15 15:27:53
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
273次阅读
2025-04-30 12:17:54
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
271次阅读
2025-04-28 11:01:25