一、基于数据库实现分布式锁

(1)利用数据库行级锁定功能实现悲观锁

在操作数据期间,通过select … for update语句锁定改行,其他事务无法修改。适用于高并发写操作、长事务处理。

inventory表结构:

Mybatis实现Mapper示例:

Service层加锁、解锁示例:

使用了 @Transactional 注解来管理事务。Spring 会在方法开始时开启一个事务,执行的 SQL 语句(如SELECT … FOR UPDATE)将会在该事务中被加锁,直到事务提交或异常回滚被解锁。

(2)通过递增版本号字段实现乐观锁。

在数据表中增加一个版本号字段,每次更新时检查版本号是否一致。版本号不一致则表示有其他事务修改了该记录。适用于读多写少场景。

inventory表结构:

Mybatis实现Mapper示例:

Service层实现乐观锁:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注