私は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
について言及しています。ちなみに、2番目の方法ではどのように 'accountId'を使用していますか? –