2012-05-11 13 views
3

私は複数のコンピュータ上で動作する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がロックを解除しないようですか?

答えて

3

、:

このレベルはREPEATABLE READと似ていますが、InnoDBは暗黙的に自動コミット が無効になっている場合...共有モードでLOCKを選択するために、すべての 平野SELECTステートメントに変換します。

コミット後に自動コミットを再度有効にするか、接続を試みるとよいでしょう。代わりにREPEATABLE_READ。

+0

を扱うデッドロックについて議論され、次のリンクを見ているが、これは私の問題を修正、ありがとうございます! – Gotenks

0

JDBCを使用してトランザクションを行う方法については、this documentantionを参照してください。それが役に立てば幸い。

0

finallyブロックでは常にconn.close()を実行して、メソッドで使用されるリソースが確実に解放されるようにしてください。 SERIALIZABLEについてMySQLのマニュアルに従って

0

はい、最初の答えが示すように接続を閉じます。ただし、上記のコードを「同期」メソッドに入れることができれば、一度に1つのスレッドしかアクセスできないことを確認します。それとは別に

、ちょうどJDBC

Deadlock detection in Java

関連する問題