在分布式系统中,可能会出现多个服务器共享同一个数据库的情况。在这种情况下,如何保证数据的一致性,同时又避免出现数据冲突?以下是一些解决方案。
乐观锁是一种乐观的并发控制机制,其核心思想是假设并发冲突不会发生,只在提交数据前检查是否有冲突,如果有,则返回错误。在数据库中,可以使用版本号或时间戳等方式实现乐观锁。
代码示例:
public void updateData(int id, String content, long version) {
String sql = "UPDATE table SET content = ?, version = ? WHERE id = ? AND version = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, content);
ps.setLong(2, version + 1);
ps.setInt(3, id);
ps.setLong(4, version);
int rows = ps.executeUpdate();
if (rows == 0) {
throw new Exception("Update failed due to version conflict.");
}
} catch (SQLException e) {
// handle exception
}
}
悲观锁的核心思想是在操作数据前,先锁定数据,防止并发操作。在数据库中,可以使用排它锁实现悲观锁。
代码示例:
public void updateData(int id, String content) {
try {
conn.setAutoCommit(false);
String sql = "SELECT * FROM table WHERE id = ? FOR UPDATE";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
String oldContent = rs.getString("content");
long version = rs.getLong("version");
String updateSql = "UPDATE table SET content = ? WHERE id = ?";
PreparedStatement updatePs = conn.prepareStatement(updateSql);
updatePs.setString(1, content);
updatePs.setInt(2, id);
int rows = updatePs.executeUpdate();
if (rows == 0) {
throw new Exception("Update failed.");
}
} else {
throw new Exception("Data not found.");
}
conn.commit();
} catch (SQLException e) {
conn.rollback();
// handle exception
}
}
分布式锁是一种跨进程、跨机器的锁机制
下一篇:不同服务器之间的数据库如何查询