자바 API를 작성 중이며 MySQL을 사용하고 있습니다. 스레드로부터 안전하게 읽고 데이터베이스에 쓰는 가장 좋은 방법은 무엇입니까?데이터베이스에 스레드로부터 안전하게 읽고 쓰는 방법은 무엇입니까?
// 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 사용자가 읽기 :
는 예를 들어, 다음 createUser
방법을. 그런 다음 소스 B는 createUser
을 호출하고 소스 A가 업데이트를 실행하기 전에 소스 B는 계정 ID가 0 인 사용자를 읽습니다. 결과적으로 소스 A와 소스 B 모두 기본 사용자를 생성합니다.
이 상황을 어떻게 안전하게 구현할 수 있습니까?
이 질문은 실제로 스레드 안전성과 아무 관련이 없습니다. 이 질문이 실제 질문입니까 아니면 질문을 설명하는 방법으로 사용하고 있습니까? 또한, 어떤 데이터베이스 시스템 (MySQL, SQL Server 등)을 사용하고 있습니까? –
그/그녀는 MySQL – Ele
을 언급했다. 그런데 어떻게 두 번째 방법에서'accountId'를 사용하고 있습니까? –