乐观锁主要有两种实现方式:版本号机制和 CAS(Compare And Swap,比较并交换)机制。下面分别介绍:
1. 版本号机制
版本号机制通过为数据添加版本标识,每次更新时检查版本是否匹配来判断是否有并发冲突。
代码示例:
1.创建实体:
java
@lombok.Data
@lombok.AllArgsConstructor
@lombok.NoArgsConstructor
public class Data {
/**
* 实体类
*/
private int id;
private int version;
private String value;
}
2.创建一个controller
java
@RestController
@RequestMapping("/versionOptimisticLock")
public class VersionOptimisticLockController {
@Autowired
private VersionOptimisticLockMapper mapper;
@PutMapping("/update")
public void update(@RequestBody Data data) {
Data dataById = mapper.getById(data.getId());//获取数据库中的数据
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
int affectRows = mapper.update(dataById);
if (affectRows == 0) {
throw new RuntimeException("更新失败");
}
System.out.println("更新成功");
}
}
创建mapper:
java
@Mapper
public interface VersionOptimisticLockMapper {
@Update("update optimisticlockTable set value=#{value},version=version+1 where id=#{id} and version=#{version}")
int update(Data data);
@Select("select id, value, version from optimisticlockTable where id= #{id} ")
Data getById(int id);
}
使用postman等工具进行测试,发送两个请求同时,结果肯定是一个成功一个失败。


控制台:
