java - innodb 中的行级别的锁
过去多啦不再A梦
过去多啦不再A梦 2017-05-17 10:05:00
[Java讨论组]

Innodb 实现了两种行级别的锁, 一个是共享锁,一个是排它锁。
请问:
(1)行级别的锁是不是只能加载行记录上? 为什我看到有的地提到表级上也可以共享锁和排它锁呢?

各位可以提示下吗

过去多啦不再A梦
过去多啦不再A梦

全部回复(4)
PHP中文网

InnoDB的行锁只在锁语句(也就是FOR UPDATE和LOCK IN SHARE MODE)使用到索引时才有效,因为InnoDB锁的其实是根据索引锁住行的。也就是说,如果没有使用索引,锁就会自动提升到表级别。

PHP中文网

如果楼上所说,在事物隔离级别为repeat read下(mysql默认级别)
InnoDB引擎在修改删除数据时,会先查找到对应的索引,索引都是排序了的,所以会锁住某个值或者某个范围。
如果这个范围是整个索引段,那么则整个表数据均会被锁住;另外没有索引,在做修改删除操作的时候会全表扫描数据,自然也会锁全表。

迷茫

InnoDB实现了以下两种类型的行锁。
共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。
另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

行锁是加在行上的,表锁就是对应整个表。行锁和表锁是可以共存的!

曾经蜡笔没有小新

锁是mysql引擎都有的。行锁和表锁是在锁粒度的角度上区分的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号