技术文摘
Mysql 中悲观锁与乐观锁的应用方法
Mysql 中悲观锁与乐观锁的应用方法
在数据库并发控制场景下,Mysql 的悲观锁与乐观锁发挥着关键作用,合理运用它们能有效确保数据的一致性和完整性。
先来说说悲观锁。悲观锁秉持一种悲观的并发控制策略,它假定在数据处理过程中,很可能会有其他事务同时对同一数据进行修改操作。在对数据进行读取或修改前,就会先锁定该数据,阻止其他事务的干扰。在 Mysql 里,悲观锁主要通过 SELECT... FOR UPDATE 语句来实现。例如,当我们要对用户账户余额进行修改时,为避免并发问题,可执行如下语句:SELECT balance FROM user_account WHERE user_id = 1 FOR UPDATE; 这条语句会锁定 user_account 表中 user_id 为 1 的记录。在此期间,其他事务若要对该记录进行修改、删除等操作,都必须等待当前事务提交或回滚后才能执行,从而保证了数据的一致性。不过,由于悲观锁会在整个事务处理期间一直锁定数据,这可能会降低系统的并发性能,尤其在高并发场景下,容易出现锁争用问题。
再讲讲乐观锁。乐观锁采取的是乐观的并发控制策略,它认为在大多数情况下,事务之间不会发生冲突。乐观锁的实现依赖于数据版本(Version)的概念,通常在数据表中增加一个 version 字段。在更新数据时,会先检查当前数据的 version 值是否与读取数据时的 version 值一致。如果一致,说明在读取数据后没有其他事务对其进行修改,此时可以顺利更新数据,并将 version 值加 1;如果不一致,则说明数据已被其他事务修改,当前事务需要重新读取数据并进行操作。例如,在更新商品库存时,先读取商品记录 SELECT stock, version FROM product WHERE product_id = 1;,假设当前 version 为 1,在更新时执行 UPDATE product SET stock = stock - 1, version = version + 1 WHERE product_id = 1 AND version = 1;,通过这种方式确保数据的一致性。乐观锁不会像悲观锁那样长时间锁定数据,所以并发性能较好,但它不适用于冲突频繁的场景,因为频繁的版本不一致会导致事务反复重试。
在实际应用中,开发者需要根据具体业务场景来选择合适的锁机制。若业务场景中并发冲突较少,使用乐观锁能提高系统的并发性能;而在数据一致性要求极高、并发冲突可能较多的场景下,悲观锁则是更可靠的选择。
- 浅析开发者友好型的软件设计
- 科技行业热议“元宇宙”但它尚未存在之分析
- 一次彻底搞懂面试中数 1 问题的五种方法
- Python 开发中的管道 Pipe 神技
- Jarboot:强大的 Java 进程管理利器
- Javascript 中 15 种数组去重之法,必有一款适合您
- Spring Boot 五大热部署方法,让开发效率飙升!
- ThreadLocal 的使用令我几近崩溃
- Node.js 控制台跨年祝福动画绘制
- Python 第三方库 PyAudio 打造录音工具:手把手教程
- 学会巧妙使用 Metadata 动态元数据
- Sentry 开发者 SDK 开发贡献指南(客户端报告)
- Node.js 中 ObjectWrap 的弱引用难题
- Teprunner 测试平台:从登录到下单的大流程接口自动化用例编写指南
- 容器云架构下 K8s 的多区域部署