私は複数のコンピュータ上で動作するJavaアプリケーションを持ち、それらはすべて同じMySQLデータベースに接続します。データベースが正しく更新されるようにトランザクションが必要です。JavaとMySQLのトランザクション
ロックの解除に問題があります。ここでは、コードは次のとおりです。
public boolean bookSeats(int numeroSala, Calendar dataOra, List<Posto> posti) {
JDBConnection connection = JDBConnection.getDbConnection();
Connection conn = connection.conn;
java.sql.Date javaSqlDate = new java.sql.Date(dataOra.getTime().getTime());
java.sql.Time javaSqlTime = new java.sql.Time(dataOra.getTime().getTime());
try {
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
} catch (SQLException e) {
e.printStackTrace();
}
try
{
Posto p = null;
ListIterator<Posto> itr = posti.listIterator();
PreparedStatement stmt = null;
stmt = conn.prepareStatement(
"INSERT INTO sala?_tickets " +
"(giornoSpettacolo, orarioSpettacolo, fila, posto) " +
"VALUES (?, ?, ?, ?)");
stmt.setInt(1, numeroSala);
while(itr.hasNext())
{
p = itr.next();
stmt.setString(2, javaSqlDate.toString()); // giornoSpettacolo
stmt.setString(3, javaSqlTime.toString()); // orarioSpettacolo
stmt.setInt(4, p.getFila()); // fila
stmt.setInt(5, p.getNumero()); // posto
stmt.addBatch();
}
stmt.executeBatch();
conn.commit();
return true;
}
catch (SQLException e) {
e.printStackTrace();
}
return false;
}
このメソッドは、正常に動作しますが、私は同時に別のコンピュータ上でこれを実行しようとすると、私はconn.commit()
が完了したにもかかわらず、DEADLOCKのエラーを取得します。
最初のアプリケーションを終了すると、他のアプリケーションはデッドロックエラーなしでメソッドを実行できます。 COMMITがロックを解除しないようですか?
を扱うデッドロックについて議論され、次のリンクを見ているが、これは私の問題を修正、ありがとうございます! – Gotenks