2012-03-07 10 views
2

私はjava + sqlite3でトランザクションを行うことができます。私はgoogle already.Iをそれがロールバックステートメントにしたいので、ステートメント内のどこかが間違っているとすべてのステートメントが "space"に行き、DBがロールバックします。トランザクションを開始する前の瞬間まで。TRANSACTION in java + sqlite3

ここのようなものRoolback-stmt私の質問が分かりやすいと思います。英語は母国語ではないことを覚えておいてください。ここで私は声明であることをしたいコードの一部です:

ArrayList <String> al = new ArrayList <String>(); 
try { 
    // transaction begin; 
    ResultSet rs = stat.executeQuery("select _id, godziny_id from tblZmiany where harmonogram_id = " + h_id + " order by pracownik_id, Dzien"); 
    while (rs.next()) { 
     al.add("insert into tblWykonanie (Zmiana_id, Godziny_id) values ('" + rs.getLong(1) + "', " + rs.getInt(2) + ");"); 
    } 
    for (String s : al) 
     if (stat.executeUpdate(s) < 1) { 
      // Jeśli insert nie wstawił kolejnego rekordu 
      //rollback; 
      error_code = "Wystąpił problem podczas zatwierdzania harmonogramu."; 
      return false; 
     } 
     // commit;   
} catch (SQLException e) { 
    e.printStackTrace(); 
    System.out.println(e.getMessage()); 
    return false; 
} catch (Exception e) { 
    error_code = e.getMessage(); 
    return false; 
} 
return true; 

答えて

10

接続レベルで、またはバッチステートメントで2つの方法のいずれかを実行できます。

接続レベル:

final boolean oldAutoCommit = stat.getConnection().getAutoCommit(); 
stat.getConnection().setAutoCommit(false); 

try { 
    // Your update and insert code here 
} catch(Exception e) { 
    stat.getConnection().rollback(); 
} finally { 
    stat.getConnection().commit(); 
    stat.getConnection().setAutoCommit(oldAutoCommit); 
} 

エラー処理は、擬似コードから省略されているが、あなたは一般的なアイデアを得ます。

for(String query: queries) { 
    stat.addBatch(query); 
} 

try { 
    stat.executeBatch(); 
} catch(Exception e) { 
    // ... 
} 

たくさんクリーナーです:あなたは、接続をいじりを避けるために、代わりにバッチ文を使用することをお勧めします。 DatabaseMetaData.supportsBatchUpdates()でバッチ処理をサポートしていることを常に確認することができます。

0

は、トランザクションをサポートSQLiteJDBCなどのJDBCドライバを使用してください。

+0

Zentusのsqlitejdbc-v056を使用しています – Bulit

+0

Zentusドライバは幾分古いです。 –

+0

私は今までこの仕事が完璧でしたので、このサンプルコードでここで取引を行う方法が必要なので、古くなっているかどうかは興味がありません。 – Bulit