SELECTで、その行を削除するまでその行の後続の読み取りをブロックする場合は、Markがコメントで示しているように、次のことを行う必要があります
- トランザクションを有効にする(
setAutoCommit(false)
) - トランザクション分離をSERIALIZABLEに設定し、
-
SELECT ... FOR UPDATE
を使用します
このサンプルコードは私のために機能します:
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
conn.setAutoCommit(false);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT token_id FROM tokens ORDER BY token_id LIMIT 1 FOR UPDATE");
rs.next();
int token_id = rs.getInt("token_id");
System.out.printf("Got %d.%n", token_id);
PreparedStatement ps = conn.prepareStatement("DELETE FROM tokens WHERE token_id=?");
ps.setInt(1, token_id);
ps.executeUpdate();
conn.commit();