mysql中select * for update锁表的问题

本文详细介绍了MySQL中SELECT...FOR UPDATE语句的使用方法及其锁定机制。重点解释了InnoDB存储引擎下不同情况下的行级锁定(row lock)和表级锁定(table lock)行为,并通过实例演示了如何基于主键和其他条件实现精确锁定。

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

先前介绍过SELECT ... FOR UPDATE的用法,不过锁定(Lock)的资料是判别就得要注意一下了。由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。 

举个例子: 

假设有个表单products ,里面有id跟name二个栏位,id是主键。 

例1: (明确指定主键,并且有此笔资料,row lock

SELECT * FROM products WHERE id='3' FOR UPDATE; 


例2: (明确指定主键,若查无此笔资料,无lock

SELECT * FROM products WHERE id='-1' FOR UPDATE; 

例3: (无主键,table lock

SELECT * FROM products WHERE name='Mouse' FOR UPDATE; 

例4: (主键不明确,table lock

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例5: (主键不明确,table lock

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE; 


注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。 

注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。
### 关于 MySQL 中 `SELECT FOR UPDATE` 和 `SELECT FOR INSERT` 的区别 #### 1. **定义与用途** - `SELECT FOR UPDATE` 是一种定机制,用于在事务中对查询到的记录加写 (X Lock),防止其他事务修改这些记录。它通常应用于更新操作场景下,确保数据的一致性和隔离性[^1]。 - `SELECT FOR INSERT` 并不是一个标准 SQL 或者 MySQL 官方支持的关键字组合。然而,在实际开发中,“`SELECT FOR INSERT`”可能指代的是为了后续插入操作而进行的选择查询行为。这种情况下,开发者可能会先通过 `SELECT` 查询某些条件下的最大值或其他元信息,再基于此构建新记录并执行 `INSERT` 操作。 #### 2. **的行为差异** - 对于 `SELECT FOR UPDATE`,其会对符合条件的结果集施加重叠范围内的行级。如果没有匹配的数据,则不会触发任何动作[^1]。这意味着只有存在满足 WHERE 条件的具体行才会被定;反之亦然——即不存在对应行时无影响。 - 如果提到所谓的 “`SELECT FOR INSERT`”,由于这并非正式语法结构,因此也就不存在直接关联的显式定概念。不过需要注意一点:当准备向某个唯一索引字段插入重复键值之前所做的验证性质 SELECT 查找确实有可能引发间隙(Gap Locks)现象,从而间接阻碍并发尝试相同逻辑路径的操作进程直到当前事务完成为止[^3]。 #### 3. **性能考量** - 使用 `SELECT FOR UPDATE` 可能会导致较高的资源消耗以及潜在死风险,特别是在高并发环境下频繁访问同一组数据的情况下。因为每次调用都会试图获取独占权限直至整个事务结束才释放所持有的所有对象[^2]。 - 针对假定意义上的 `SELECT FOR INSERT` 场景而言,虽然本身不涉及明确指定类型的定策略应用,但如果涉及到复杂计算过程或者依赖外部状态判定的话同样也可能带来额外开销甚至竞争状况发生几率增加的情况。 ```sql -- 示例代码展示如何正确运用 SELECT FOR UPDATE START TRANSACTION; -- 加特定 ID 行 SELECT column_name FROM table_name WHERE id = ? FOR UPDATE; -- 执行必要的业务处理... COMMIT; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值