mysql乐观锁,悲观锁,什么情况间隙锁会退化,在哪个隔离级别生效?
1 个回答
我依旧待人真诚,但不寄予厚望。姜尚**MySQL 的乐观锁与悲观锁** - **乐观锁**:假设数据并发冲突的可能性较低,不会主动加锁。通常通过**版本号**或**时间戳**机制,在更新时检查数据是否被修改过,若有修改则进行重试或失败处理。 - **悲观锁**:假设数据并发冲突的可能性较高,操作前会主动加锁,阻止其他事务对数据进行修改。典型实现是数据库的行锁、表锁等。 **间隙锁的退化情况** - **间隙锁(Gap Lock)**:InnoDB 存储引擎在可重复读(`REPEATABLE READ`)和串行化(`SERIALIZABLE`)隔离级别下,为防止幻读(Phantom Read)而使用的一种锁机制,它锁定一个范围,阻止其他事务在该范围内插入、删除或修改数据。 - **退化条件**: - 当查询条件使用了**唯一索引**的**等值查询**时,InnoDB 只会对匹配的行加**行锁(Record Lock)**,而不会使用间隙锁。 - 在这种情况下,间隙锁会退化为行锁,因为唯一索引的等值查询只可能返回一条记录,不存在幻读问题。 **间隙锁在哪个隔离级别生效** - **可重复读(`REPEATABLE READ`)**: - 默认情况下,InnoDB 在该隔离级别下使用间隙锁,防止幻读。 - 间隙锁在此隔离级别**生效**。 - **读已提交(`READ COMMITTED`)**: - 间隙锁默认**不生效**,InnoDB 只使用行锁。 - 可以通过设置参数 `innodb_locks_unsafe_for_binlog=0` 来启用间隙锁,但一般不推荐。 - **串行化(`SERIALIZABLE`)**: - 间隙锁在此隔离级别下**生效**,确保事务完全隔离。 **总结** - **间隙锁退化**发生在使用唯一索引的等值查询时,此时只加行锁,不加间隙锁。 - **间隙锁生效的隔离级别**主要是**可重复读**和**串行化**。 - 在**读已提交**隔离级别下,间隙锁默认不生效。 **注意** - 使用间隙锁可以防止幻读,但可能导致锁竞争增加,需根据业务需求选择合适的隔离级别和锁机制。发布于 2024-10-24 08:34 •IP属地 四川举报评论收藏
公众号进入网站体验更佳

