我正在编写一个Java API,并且正在使用MySQL。线程安全读取和写入数据库的最佳做法是什么?如何线程安全地读取和写入数据库?
例如,采取以下createUser
方法:
// Create a user
// If the account does not have any users, make this
// user the primary account user
public void createUser(int accountId) {
String sql =
"INSERT INTO users " +
"(user_id, is_primary) " +
"VALUES " +
"(0, ?) ";
try (
Connection conn = JDBCUtility.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
int numberOfAccountsUsers = getNumberOfAccountsUsers(conn, accountId);
if (numberOfAccountsUsers > 0) {
ps.setString(1, null);
} else {
ps.setString(1, "y");
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// Get the number of users in the specified account
public int getNumberOfAccountsUsers(Connection conn, int accountId) throws SQLException {
String sql =
"SELECT COUNT(*) AS count " +
"FROM users ";
try (
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
return rs.getInt("count");
}
}
说源A调用createUser
,和刚刚读该帐户ID 100具有0个用户。然后,源B调用createUser
,并且在源A执行更新之前,源B也读取了该帐户ID具有0个用户。结果,源A和源B都创建了主要用户。
这种情况如何安全实施?
所以这个问题实际上与线程安全无关。这是你真正的问题还是你用它来解释你的问题?另外,你正在使用什么数据库系统(MySQL,SQL Server等)? –
他/她已经提到了MySQL – Ele
顺便说一句,您如何在第二种方法中使用'accountId'? –