java - java + sqlite3 中的事务

标签 java transactions sqlite

我怎样才能在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;

最佳答案

您可以通过以下两种方式之一执行此操作:在连接级别或通过批处理语句

在连接级别:

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()检查您的数据库/驱动程序是否支持批量事务。

关于java - java + sqlite3 中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9601030/

相关文章:

java - android java,正则表达式条件替换匹配的子内容(如javascript的str.replace(pattern,function(){})

json - 使用 Core Data 一对多关系从 JSON 数组填充 sqlite 数据库

java - sqlite 安卓 : table not found

java - 类型不匹配 : cannot convert from Element to Elements & first cannot be resolved or is not a field

java - 从列表中删除数据后如何更新 ListView ?

java - 在 DAO 层之外使用 @org.springframework.transaction.annotation.Transactional?

android - Sqlite 不更新行

java - 使用 rxJava 的下游运算符的数据库(SQLite)事务

sqlite - 在删除中使用别名

java - JSP/Servlet 和 PHP 页面之间的通信?