Update 锁

博客包含前言、正文和总结三部分,但具体内容未详细阐述信息技术相关信息。

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

前言

 未完待续。

正文

总结

### MySQL 更新操作中的机制及工作原理 在 MySQL 中,`UPDATE` 操作涉及的机制主要包括 **悲观** 和 **乐观**。以下是关于这两种的工作方式及其具体实现: #### 1. 悲观 (Pessimistic Locking) 悲观的核心理念在于假定并发冲突不可避免,并通过加的方式防止其他事务对同一资源进行修改。 当执行 `SELECT ... FOR UPDATE` 或者直接运行带有写入性质的操作(如 `INSERT`, `DELETE`, `UPDATE`)时,MySQL 默认会启用行级来保护被访问的数据。 - 使用 `FOR UPDATE` 的 SQL 查询可以显式地请求悲观[^3]。 - 这种情况下,目标记录会被锁定直到当前事务完成提交或回滚为止,在此期间任何试图更改相同数据的行为都会阻塞等待解或者抛出异常终止尝试。 - 需要注意的是,为了使悲观生效,必须先关闭 Mysql 自动提交模式 (`autocommit=0`) 否则每次单独命令都将作为一个独立的小型事物处理从而无法维持长时间跨多步逻辑控制下的独占状态维护需求[^2]. ```sql START TRANSACTION; SET autocommit = 0; -- 加读取某条记录 SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 执行更新或其他业务逻辑... UPDATE table_name SET column='value' WHERE id = 1; COMMIT; -- 提交后释放 ``` #### 2. 乐观 (Optimistic Locking) 相比之下,乐观采取了一种更加宽松的态度对待潜在的竞争条件——它并不主动阻止其它进程访问共享对象而是允许它们自由行动直至最后保存变更前一刻才验证是否有冲突发生如果发现确实存在差异那么就拒绝此次改动并提示重新加载最新版本再试一次整个流程. 通常可以通过引入额外字段比如时间戳(timestamp)或是修订号(version number),并在每一次 DML(Data Manipulation Language)语句里加入相应的校验条件达成目的: ```sql BEGIN; -- 假设 version 是用来做版本控制的一个整数列名 UPDATE table_name SET column='newValue',version=version+1 WHERE id=specificId AND version=currentVersionValue ; IF ROW_COUNT()=0 THEN ROLLBACK ELSE COMMIT END IF ; END; ``` 上述例子展示了如何利用版本号来进行乐观管理。只有当数据库里的实际值与客户端预期的一致(即没有别的线程抢先一步做了改变),该次update才会成功,否则返回影响行为数量为零意味着失败需要重试.[^1] 总结来说,无论是采用哪种类型的锁定策略都各有优劣需视具体情况而定。对于那些高频率读少写的应用场景而言往往更适合选用性能开销较小却同样有效的乐观方案;而对于一些关键性的核心模块可能更倾向于稳妥可靠的悲观形式以保障绝对意义上的数据一致性不受破坏风险干扰。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值