【问题标题】:SQLite transaction not committedSQLite 事务未提交
【发布时间】:2016-02-12 13:29:33
【问题描述】:

我在我的应用程序中使用 SQLite。
数据库工作正常。
我可以插入、选择和更新行,但在这种情况下,事务没有提交。

public int updateTransaction(String oldstatus, String newstatus) {
    int result;
    try {
        mDB.beginTransaction();
        ContentValues values = new ContentValues();
        values.put("trx_status", newstatus);
        result = mDB.update("transaktion", values, "trx_status = ?", new String[] { oldstatus });
        Log.d("DB", "updateTransaction:number of updated rows:" + result);
        mDB.setTransactionSuccessful();
    } catch (SQLiteException e) {
        Log.d("TAGAB", "Error:" + e.getLocalizedMessage());
        result = -1;
    } finally {
        mDB.endTransaction();
    }

    Log.d("TAGAB", "in Transaction? " + mDB.inTransaction());
    return result;
}

在 LogCat 中:

"TAGAB" in Transaction? true

最初执行更新,如果我选择行,我会收到具有新状态的行。

应用程序关闭并重新启动后,行又恢复了旧状态!
事务是否回滚?如果是这样,为什么? 数据库被定义为单例。

private SQLiteDatabase mDB;
private static DatabaseAdapter INSTANCE;

【问题讨论】:

    标签: java android sqlite commit


    【解决方案1】:

    “inTransaction true”暗示您有一个外部事务,该内部事务嵌套在其中。

    查询正在进行的事务中的数据时一切正常。

    Android sqlite 仅部分支持嵌套事务。最外层事务会发生什么决定了所有嵌套事务会发生什么。

    在您的情况下,最外层事务被回滚,嵌套事务中的任何更改也被回滚。

    【讨论】:

    • 感谢您的快速答复!我还没有开始任何其他交易。这是单笔交易。
    • 那么外部事务是由其他东西启动的——你从哪里调用方法?
    • 点击保存按钮后,任何Activity都会调用这个方法:DatabaseAdapter da = DatabaseAdapter.getInstance(null, dummyPassword"); int result = da.updateTransaction("U", "T"); // 行更新成功
    • 解决了!你是对的。并行仍然是一项开放的交易。在我关闭它后,数据库工作正常。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2011-03-13
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多