mysql中 for update 使用

本文深入解析forupdate在数据库中的作用,即为行级记录上排它锁,防止其他事务在当前事务未完成前进行写入或更新操作。文章通过实例说明了在不同条件下forupdate如何工作,包括行级锁与表级锁的区别,以及主键指定对锁类型的影响。

解释:
for update是在数据库中上锁用的,可以为数据库中的行上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
只要此行是索引行即可实现行级锁的效果.对于同时在线用户为千人级的项目,for update可以使用,大项目需要另外做优化,以及秒杀也不可用此方法

由于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;
SELECT * FROM products WHERE id='3' and type=1 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;
### MySQLFOR UPDATE 锁机制 `FOR UPDATE` 是 MySQL 提供的一种行级锁定机制,用于在事务中确保数据一致性。当在一个事务中执行 `SELECT ... FOR UPDATE` 查询时,所选中的行会被加上排他锁(exclusive lock),这意味着其他事务无法修改这些被锁定的行,直到当前事务完成并释放锁。 #### 行级锁 vs 表级锁 - 如果查询条件中涉及索引列(尤其是主键或唯一索引),MySQL 通常只会对符合条件的具体行加锁,这种行为称为 **行级锁**[^1]。 - 若查询条件未命中任何索引,则可能导致整个表被锁定,即发生 **表级锁**[^2]。 #### 加锁过程与并发控制 一旦某一行通过 `FOR UPDATE` 被锁定,在另一个事务尝试对该同一行也发起 `FOR UPDATE` 请求时,后者将进入等待状态直至前一事务结束(提交或回滚)。然而需要注意的是,普通的只读型 SELECT 不受影响——即使目标记录已被另一事务以 `FOR UPDATE` 方式锁定,新来的只读请求仍可顺利完成而不需排队等候解锁[^4]。 以下是关于如何运用此功能的一些具体例子: ```sql START TRANSACTION; -- 假设我们想要更新订单号为1的状态之前先确认其现状 SELECT * FROM orders WHERE order_id = 1 FOR UPDATE; UPDATE orders SET status='shipped' WHERE order_id=1; COMMIT; ``` 上述脚本展示了典型的使用模式:启动一个新的显式事务;接着利用带 `FOR UPDATE` 子句的选择命令获取特定条目的最新版本及其上的写权限;最后做出必要的更改再提交变更。 ### 使用场景分析 考虑到性能开销以及潜在死锁风险等因素,合理规划何时何地应用此类强约束显得尤为重要。下面列举了几种适合采用 `FOR UPDATE` 的典型情境: 1. 当应用程序需要基于现有数据库内容计算得出新的数值后再存入DBMS里头的时候; 2. 需要防止两个独立进程同时访问相同的数据集从而引发竞争状况的情形下; 3. 实现队列管理或者库存控制系统之类的功能模块期间。 尽管如此,过度依赖于这类悲观策略也可能带来负面影响比如降低吞吐量等负面效应因此应当谨慎权衡利弊之后决定是否采纳该方法论作为解决方案的一部分[^3]. 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值