select...for update使用的什么锁呢?
下文笔者讲述"select...for update"相关锁说明,如下所示
锁简介
`SELECT ... FOR UPDATE` 使用 是排他锁(Exclusive Lock) 也称为 写锁(X-Lock)
锁类型说明
锁类型 | 说明 |
共享锁(Shared Lock, S-Lock) | 允许多个事务读取同一资源,但阻止其他事务获取排他锁 适用于 `SELECT ... LOCK IN SHARE MODE` |
排他锁(Exclusive Lock, X-Lock) | 阻止其他事务读写该资源,确保当前事务独占访问 适用于 `SELECT ... FOR UPDATE` |
行为特点
- 当一个事务执行了 `SELECT ... FOR UPDATE`: - 它会对选中的记录加上 "排他锁**。 - 其他事务不能修改这些记录(如 [UPDATE]),
也不能对其加锁(包括 `SELECT ... FOR UPDATE` 和 `SELECT ... LOCK IN SHARE MODE`) - 直到当前事务提交或回滚后,锁才会释放。
使用场景
高并发下保证数据一致性:
如库存扣减、订单创建等需要防止并发修改的业务逻辑 避免脏读和不可重复读:
在可重复读(RR)隔离级别下可以防止这类问题
注意事项
死锁风险:例
多个事务交叉请求锁时可能引发死锁,需合理设计事务顺序。 锁粒度:
根据查询条件是否命中索引,MySQL 可能使用行锁或表锁。 - 如果命中索引:使用 行级锁 。 - 如果未命中或全表扫描:可能升级为 表级锁 。 事务提交后释放锁**:务必注意事务的边界,避免长事务占用锁资源。
START TRANSACTION; SELECT * FROM orders WHERE order_id = 1001 FOR UPDATE; -- 此时其他事务无法修改 order_id=1001 的记录 UPDATE orders SET status = 'processing' WHERE order_id = 1001; COMMIT;
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。