SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

本文详细探讨了InnoDB表中FORUPDATE锁的使用场景,包括行级锁定、锁定条件(主键指定、不存在数据)、锁定范围(无主键或全表),并举例说明了在火车票预订等业务中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

1.FOR UPDATE 加的锁是一种行级排他锁,也是一种悲观锁
2.加锁的事务可以查询也可以修改被加锁的数据行,其它事务只能查询但不能修改被加锁的数据行,而且其它事务不能再往这个数据行加任何类型的锁
3.FOR UPDATE 给行加锁,必须在事务控制模块中才能生效
4.FOR UPDATE 仅适用于 InnoDB
5.MyISAM 只支持表级锁,InnoDB 支持表级锁和行级锁

注:不显式执行 START TRANSACTION,执行 DML 语句也是一个事务,默认自动提交。

什么时候释放锁:

1.执行提交或回滚语句
2.退出数据库
3.程序停止运行

加锁情况分析

查询 InnoDB 表数据时,只有查询条件中明确指定主键值,MySQL 才会锁定行;否则 MySQL 将会锁定整个表。

假设有下面这张表及数据:

mysql> select * from user;
+----------------------+----------+
| id                   | NAME     |
+----------------------+----------+
| 00000000000000000001 | zhangsan |
| 00000000000000000002 | lisi     |
| 00000000000000000003 | libai    |
+----------------------+----------+
3 rows in set (0.00 sec)

注:ID 是主键。

明确指定主键,并且数据真实存在,锁定行

START TRANSACTION; -- 开始事务
SELECT * FROM user WHERE id=00000000000000000003 FOR UPDATE;
SELECT * FROM user WHERE id=00000000000000000003 and name='lisi' FOR UPDATE;

明确指定主键,但数据不存在,不加锁

SELECT * FROM user WHERE id=0 FOR UPDATE;

主键不明确,锁定整个表

SELECT * FROM user WHERE id<>3 FOR UPDATE;
SELECT * FROM user WHERE id LIKE '%3%' FOR UPDATE;

注意:不管是否查询到记录,都会锁定表。

无主键,锁定整个表

SELECT * FROM user WHERE name='libai' FOR UPDATE;

应用场景

比如火车票订票,在手机屏幕上显示有票,如果没有锁定相关数据,在真正进行出票(扣减锁票)时,你必须重新确定一下这个数据有没有被其他客户端修改过。如果你使用了行级锁,则可以直接出票,所以这个业务场景可以使用 FOR UPDATE 对数据进行加锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值