2012-03-07 29 views
2

我怎樣才能使交易在java + sqlite3我檢查谷歌already.I要使它成爲回滾語句,所以如果某處在語句出錯所有語句去「空間」和數據庫得到回滾到開始交易之前的時刻。在java + sqlite3 TRANSACTION

這樣的東西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

您可以通過兩種方式之一在連接級別或通過批處理語句執行此操作。

在連接級別:

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

使用JDBC驅動程序一樣SQLiteJDBC支持交易。

+0

我使用Zentus的sqlitejdbc-v056 – Bulit 2012-03-07 12:17:10

+0

Zentus驅動程序有點過時。 – 2012-03-07 12:18:51

+0

我不感興趣的是它是過時的還是沒有,因爲直到現在這個工作對我來說完美的我現在需要如何在這個示例代碼中進行交易。 – Bulit 2012-03-07 12:32:11