java - innodb 中的行级别的锁
问题描述
Innodb 实现了两种行级别的锁, 一个是共享锁,一个是排它锁。 请问:(1)行级别的锁是不是只能加载行记录上? 为什我看到有的地提到表级上也可以共享锁和排它锁呢?
各位可以提示下吗
问题解答
回答1:InnoDB的行锁只在锁语句(也就是FOR UPDATE和LOCK IN SHARE MODE)使用到索引时才有效,因为InnoDB锁的其实是根据索引锁住行的。也就是说,如果没有使用索引,锁就会自动提升到表级别。
回答2:如果楼上所说,在事物隔离级别为repeat read下(mysql默认级别)InnoDB引擎在修改删除数据时,会先查找到对应的索引,索引都是排序了的,所以会锁住某个值或者某个范围。如果这个范围是整个索引段,那么则整个表数据均会被锁住;另外没有索引,在做修改删除操作的时候会全表扫描数据,自然也会锁全表。
回答3:InnoDB实现了以下两种类型的行锁。 共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。 意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。 意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
行锁是加在行上的,表锁就是对应整个表。行锁和表锁是可以共存的!
回答4:锁是mysql引擎都有的。行锁和表锁是在锁粒度的角度上区分的
相关文章:
1. java - mybatis怎么实现在数据库中有就修改,没有就添加2. MYSQL新建用户设置可以远程访问的问题3. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题4. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)5. angular.js - angularjs的自定义过滤器如何给文字加颜色?6. javascript - 用表单提交两个时间段请求后台返回对应数据时出现的一些问题!7. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?8. mysql - SQL操作时间的函数?9. mysql - 我的myeclipse一直连显示数据库连接失败,不知道为什么10. mysql 为何insert的时候会有lock wait timeout 异常
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)