技术文摘
MySQL 乐观锁与悲观锁的详细实现方式
2025-01-15 00:43:50 小编
MySQL 乐观锁与悲观锁的详细实现方式
在 MySQL 数据库的并发控制中,乐观锁和悲观锁是两种重要的机制,它们能够有效处理多用户并发访问数据时的冲突问题。
先来看悲观锁。悲观锁的核心思想是,总是假设最坏的情况,即认为在数据被访问时,很可能会有其他事务对其进行修改。在 MySQL 中,悲观锁的实现主要通过数据库自身的锁机制。比如,使用 SELECT... FOR UPDATE 语句。当一个事务执行这条语句时,MySQL 会对查询结果集中的所有行加排他锁,直到该事务结束。这就意味着在这个事务处理期间,其他事务无法对这些行进行修改操作,只能等待锁的释放。例如:
START TRANSACTION;
SELECT * FROM users WHERE user_id = 1 FOR UPDATE;
-- 进行一些数据处理操作
UPDATE users SET balance = balance - 100 WHERE user_id = 1;
COMMIT;
上述代码中,SELECT... FOR UPDATE 锁定了 user_id 为 1 的记录,防止其他事务在当前事务处理期间对其进行修改。
再说说乐观锁。乐观锁则秉持乐观的态度,它假设在大多数情况下,数据在被读取和修改期间不会被其他事务修改。乐观锁的实现通常依赖于数据版本(Version)的控制。一般做法是在表中添加一个版本号字段,每次数据更新时,版本号递增。在更新数据前,先读取数据及其版本号,在执行更新操作时,通过版本号来判断数据在读取后是否被其他事务修改过。如果版本号一致,说明数据没有被修改,可以进行更新;否则,更新失败。示例如下:
-- 读取数据及其版本号
SELECT user_name, balance, version FROM users WHERE user_id = 1;
-- 假设读取到的版本号为 version = 5
UPDATE users SET balance = balance - 100, version = version + 1 WHERE user_id = 1 AND version = 5;
如果在执行 UPDATE 语句时,version 已经不是 5 了,说明数据在读取后被其他事务修改过,这次更新将不会生效。
乐观锁和悲观锁各有优劣。悲观锁能够确保数据的一致性,但并发性能相对较低;乐观锁并发性能较好,但可能会因为冲突导致更新失败,需要进行重试操作。在实际应用中,要根据具体的业务场景和需求,合理选择使用乐观锁或悲观锁,以实现高效、可靠的数据处理。
- 取消同源策略后网站Cookie安全的风险有哪些
- 解决Vue页面重绘引发第三方组件重复渲染问题的方法
- 没有同源策略时网站安全面临的风险有哪些
- 同源策略缺失致其他网站窃取银行Cookie的原理
- 无同源策略保护时第三方网站怎样窃取网站Cookie
- 层次扁平化乃管理软件设计复杂性之秘诀
- 新 Web 开发人员进入后端世界必备技巧
- Nodejs集群及Worker的运用
- JavaScript获取可滚动元素内子元素实时坐标及监听滚动事件方法
- 获取可滚动元素内子元素精确坐标的方法
- JS原生获取可滚动元素内子元素精确坐标的方法
- TypeScript中定义函数,依据第一个参数路径约束第二个参数对象并精确推断最终URL字符串的方法
- TypeScript函数参数类型约束:依据路径推断参数构建完整URL的方法
- 怎样设计函数依据路径约束参数精准推断最终 URL 字符串
- 滚动层嵌套时怎样避免上层滚动对下层滚动产生影响