mysql中的for update

 

Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句。

该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。

 

 

 主要是高并发下,多访问者同时操作数据库,导致数据(比如卖票)为负数,所以要为数据库 加锁 

 

扩展阅读,可以搜索   php高并发,mysql 行锁 表锁,php 消息队列

 

https://blog.youkuaiyun.com/nuli888/article/details/51865401

 

### 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、付费专栏及课程。

余额充值