Skip to content

乐观锁

乐观锁通过版本号机制确保并发场景下的数据一致性。更新时,版本字段会自动递增并加入 WHERE 条件,如果数据已被其他事务修改,将抛出异常或返回 0 条受影响行。

全局配置

通过 OptimisticLockConfig 配置乐观锁行为:

配置项默认值描述
enabledfalse是否启用乐观锁
fieldNameversion版本字段名
initialVersion0L默认初始版本值
throwOnFailuretrue乐观锁失败时是否抛出异常
optimisticLockProcessor默认实现乐观锁处理器,可控制哪些表需要处理

启用示例

java
import com.tang.kite.config.optimistic.OptimisticLockConfig;

OptimisticLockConfig.setEnabled(true);

@Version 注解

使用 @Version 注解标记版本字段,优先级高于全局配置的 fieldName

属性类型描述
initialValueLong初始版本值,默认 0L
throwOnFailureBoolean乐观锁失败时是否抛出异常,默认 true
java
import com.tang.kite.annotation.optimistic.Version;

public class Account {

    private Long id;
    private String name;
    @Version(initialValue = 0L)
    private Long version;

}

乐观锁处理器

实现 OptimisticLockProcessor 接口来自定义乐观锁处理器,控制哪些表需要乐观锁处理。

方法名描述返回值
processable(tableClass: Class<*>)判断特定表实体类是否需要乐观锁处理,默认 trueBoolean

自定义处理器

java
import com.tang.kite.config.optimistic.OptimisticLockProcessor;

public class AccountOptimisticLockProcessor implements OptimisticLockProcessor {

    @Override
    public boolean processable(Class<?> tableClass) {
        return tableClass == Account.class;
    }

}

配置自定义处理器

java
OptimisticLockConfig.setOptimisticLockProcessor(new AccountOptimisticLockProcessor());

乐观锁管理器

OptimisticLockManager 用于在特定场景下临时启用或跳过乐观锁。

方法列表

方法名描述返回值
withOptimisticLock(block: Runnable)临时使用乐观锁执行代码块
withOptimisticLock(block: Supplier<T>): T临时使用乐观锁执行代码块并返回结果T 代码块的返回值
withSkip(block: Runnable)跳过乐观锁执行代码块
withSkip(block: Supplier<T>): T跳过乐观锁执行代码块并返回结果T 代码块的返回值

使用示例

临时使用乐观锁

java
import com.tang.kite.optimistic.OptimisticLockManager;

OptimisticLockManager.withOptimisticLock(() -> {
    accountMapper.updateById(account);
});

跳过乐观锁

java
import com.tang.kite.optimistic.OptimisticLockManager;

OptimisticLockManager.withSkip(() -> {
    accountMapper.updateById(account);
});

基于 MIT 许可发布