Bul*_*lit 2 java sqlite transactions
如何在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;
Run Code Online (Sandbox Code Playgroud)
Per*_*ion 11
您可以在连接级别或批处理语句中执行以下两种方法之一.
在连接级别:
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);
}
Run Code Online (Sandbox Code Playgroud)
伪代码中省略了错误处理,但您可以得到一般的想法.您可能希望避免弄乱连接,而是使用批处理语句:
for(String query: queries) {
stat.addBatch(query);
}
try {
stat.executeBatch();
} catch(Exception e) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
哪个更清洁.请记住,您可以随时检查数据库/驱动程序是否支持批量事务处理DatabaseMetaData.supportsBatchUpdates().
| 归档时间: |
|
| 查看次数: |
7678 次 |
| 最近记录: |