使用事务隔离级别来解决。
示例代码:
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// execute read operation
String sql = "SELECT * FROM my_table WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, 123);
ResultSet rs = stmt.executeQuery();
// execute write operation
sql = "UPDATE my_table SET name = ? WHERE id = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, "new name");
stmt.setInt(2, 123);
stmt.executeUpdate();
conn.commit();
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
closeConnection(conn);
}
在上面的代码中,我们使用了事务隔离级别 TRANSACTION_SERIALIZABLE
,这意味着在整个事务过程中,所有涉及到的数据都将被锁定,确保不会在任何时候被另一个事务修改。这样,我们就避免了并发事务读取被修改的数据的问题。当然,这种方法也会对性能产生一定的影响,特别是在高并发环境中。因此,我们需要在保证数据一致性的同时,尽可能地减少锁定的范围,以提高系统的并发性能。
上一篇:并发事务中合并是如何工作的?