建设网站 课程设计,企业管理软件的发展趋势,三明 网站建设,2023年电商平台排行榜1. 行级锁 InnoDB 引擎支持行级锁#xff0c;而MyISAM 引擎不支持行级锁#xff0c;只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句#xff0c;是不会加记录锁的#xff0c;因为它属于快照读#xff0c;通过在MVCC中的undo log版本链实现。如果要在查询时对…1. 行级锁 InnoDB 引擎支持行级锁而MyISAM 引擎不支持行级锁只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句是不会加记录锁的因为它属于快照读通过在MVCC中的undo log版本链实现。如果要在查询时对记录加行锁可以使用下面这两个方式这种查询会加锁的语句称为锁定读。
//对读取的记录加共享锁
select ... lock in share mode;//对读取的记录加独占锁
select ... for update; 对于DML语句update、delete和insert来说其在执行过程中会默认加上for update 系统会为目标行加上行级锁。 需要注意的是行级锁依赖索引 如果查询的条件字段 xx 上没有索引那么 InnoDB 无法精确定位查询结果中涉及的行只能通过全表扫描来查找满足条件的记录。当进行全表扫描时InnoDB 会对表中的每行数据都加上行级锁相当于把整个表都锁住了以确保在扫描期间没有其他事务对表进行修改。因此这种情况下数据库将退化为表级锁锁住整个表阻止其他事务对表进行任何修改操作直到当前事务完成。 因此对于update、delete、select ... for update 等具有加锁性质的语句一定要检查语句是否走了索引如果是全表扫描的话会把整个表都锁住。
2. 记录锁Record Lock 记录锁是一种特殊的行级锁它锁定的是数据库中的一条具体记录。在 InnoDB 存储引擎中记录锁会锁定索引中的一条记录。
记录锁是有 S 锁和 X 锁之分的
当一个事务对一条记录加了 S 型记录锁后其他事务也可以继续对该记录加 S 型记录锁S 型与 S 锁兼容但是不可以对该记录加 X 型记录锁S 型与 X 锁不兼容;当一个事务对一条记录加了 X 型记录锁后其他事务既不可以对该记录加 S 型记录锁S 型与 X 锁不兼容也不可以对该记录加 X 型记录锁X 型与 X 锁不兼容。
select * from t_test where id 1 for update 对 t_test 表中主键 id 为 1 的这条记录加上 X 型的记录锁这样其他事务就无法对这条记录进行修改了。 3. 间隙锁Gap Lock 间隙锁是一种特殊的锁机制作用于索引之间的“间隙”只存在于可重复读隔离级别用于防止在锁定的记录前后插入新记录。它主要用于防止 幻读Phantom Read确保在并发事务中查询结果在事务期间不会因其他事务插入新的行而发生变化。 假设表中有一个范围 id 为35间隙锁那么其他事务就无法插入 id 4 这条记录了这样就有效的防止幻读现象的发生。 间隙锁虽然存在 X 型间隙锁和 S 型间隙锁但是并没有什么区别间隙锁之间是兼容的即两个事务可以同时持有包含共同间隙范围的间隙锁并不存在互斥关系因为间隙锁的目的是防止插入幻影记录而提出的。
4. 临键锁Next-Key Lock 临键锁Next-Key Lock是记录锁和间隙锁的结合锁定一个范围并且锁定记录本身。 假设表中有一个范围 id 为35] 的 next-key lock那么其他事务即不能插入 id 4 记录也不能修改 id 5 这条记录。 所以next-key lock 即能保护该记录又能阻止其他事务将新纪录插入到被保护记录前面的间隙中。
5. 总结
行级锁 是最常见的锁机制用于锁定单个行记录确保并发事务之间的数据一致性适合高并发场景。记录锁 是一种作用于索引记录的行级锁通常在涉及具体行的查询或修改时使用确保其他事务无法修改特定记录。间隙锁 则用于锁定索引记录之间的间隙防止其他事务插入新的行解决并发事务中可能出现的幻读问题。