阅读量:0
乐观锁是一种并发控制策略,适用于读多写少的场景。它假设多个线程在访问数据时不会发生冲突,因此不会立即加锁,而是在更新数据时检查数据是否被其他线程修改。如果数据被修改,则更新失败,需要重新尝试操作。Java中乐观锁的实现通常依赖于版本号或时间戳。
以下是使用版本号实现乐观锁的示例:
- 在数据库表中添加一个版本号字段(例如
version
)。
CREATE TABLE example ( id INT PRIMARY KEY, data VARCHAR(255), version INT );
- 在Java代码中,使用
Version
类表示版本号:
public class Version { private int value; public Version(int value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } }
- 在更新数据时,检查版本号是否发生变化:
public boolean updateData(int id, String newData, Version currentVersion) { // 1. 查询当前数据及其版本号 Example example = exampleDao.findById(id); if (example == null || example.getVersion() != currentVersion.getValue()) { return false; // 数据不存在或版本号不一致,更新失败 } // 2. 更新数据 example.setData(newData); example.setVersion(example.getVersion() + 1); exampleDao.update(example); return true; // 更新成功 }
- 在读取数据时,获取当前版本号:
public Example readData(int id) { Example example = exampleDao.findById(id); if (example != null) { example.setVersion(example.getVersion() + 1); // 更新版本号 } return example; }
通过这种方式,当多个线程同时读取数据并尝试更新时,只有第一个线程能够成功更新数据,其他线程会因为版本号不一致而更新失败,从而保证了数据的一致性。