MySQL悲观锁详解(图文全面总结)

MySQL悲观锁详解(图文全面总结)-mikechen

MySQL经常在大厂被问到,下面我重点详解MySQL悲观锁@mikechen

MySQL悲观锁

MySQL悲观锁详解(图文全面总结)-mikechen

悲观锁,正如其名,它对数据并发操作持一种“悲观”态度,认为冲突总是会发生。

因此,在整个数据处理过程中,它会对数据进行加锁,以防止其他事务在同一时间修改同一份数据。

换句话说:先上锁,后操作,这就是“悲观锁”。

 

MySQL悲观锁实现原理

在 MySQL(InnoDB 引擎)中,悲观锁主要通过 行级锁 来实现。

MySQL悲观锁详解(图文全面总结)-mikechen

在修改或查询数据之前,当前事务会对相关数据行,加排他锁。

典型的SQL语句为SELECT ... FOR UPDATE,用以锁定行数据。

如下所示:

-- 开启事务
BEGIN;

-- 悲观锁:锁定账户为 id = 123 的行,防止其他事务修改
SELECT balance FROM accounts WHERE id = 123 FOR UPDATE;

-- 假设查到的余额为 1000
-- 业务逻辑:进行扣款,扣除 500
UPDATE accounts SET balance = balance - 500 WHERE id = 123;

-- 提交事务
COMMIT;

在这个例子中,SELECT ... FOR UPDATE 语句会立即对 id = 123 的那一行加一个排他锁。

如果此时另一个事务也想对同一行进行 FOR UPDATE 操作,它将进入等待状态,直到第一个事务提交或回滚,释放锁。

mikechen睿哥

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

评论交流
    说说你的看法