首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >房间事务回滚

房间事务回滚
EN

Stack Overflow用户
提问于 2021-07-08 19:35:25
回答 1查看 386关注 0票数 2

根据会议室文件事务回滚,在发生错误时,事务中的每个查询都回滚。

所以在这里我测试了回滚:

代码语言:javascript
复制
@Transaction
public Completable updateTable1(Table table1) {
    return Completable.fromAction(
            () -> 
                table1.setNotice("why am i updateed????");
                synchronousUpdate(table1);
                table1.setForeignKeyId(90); //some random foreign key which does not exsist so it throws an exception
                synchronousUpdate(table1);
            }
    );
}

@Update
void synchronousUpdate(T obj);

即使在第二次更新引发错误时,我的table1仍然会得到更新。

原因是什么?我是因为我返回一个可完成的值,而不是像void这样的同步返回值吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-09 02:16:12

文件上说

除非在方法体中抛出异常,否则事务将被标记为成功。

它实际上并没有说--异常将被管理为,尽管回滚将跳过setTransactionSuccessful并执行endTransaction。如果您查看生成的代码,例如,编码方法是:-

代码语言:javascript
复制
@Transaction
public boolean update4(Bookmark b1, Bookmark b2) {
    if (update(b1) > 0) {
        if (update(b2) < 1) {
            abort(b1);
            return false;
        }
    } else {
            abort(b1);
        return false;
    }
    return true;
}

会议室生成的代码是:-

代码语言:javascript
复制
  @Override
  public boolean update4(final Bookmark b1, final Bookmark b2) {
    __db.beginTransaction();
    try {
      boolean _result = AllDao_Impl.super.update4(b1, b2);
      __db.setTransactionSuccessful();
      return _result;
    } finally {
      __db.endTransaction();
    }
  }

没有catch,因此需要相应地处理异常。

请考虑以下(先前所作答覆的修订版本):

代码语言:javascript
复制
    b1.setPostUrl("YetAnotherURL");
    b5.setPostTitle("P5");
    b5.setPostUrl("U5");
    try {
        dao.update4(b1, b5);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    logInfo("-D1");
    dao.update4(b1,b5);
    logInfo("-D2");

基本上相同的更新(由于id不存在而不会更新(返回0) )运行两次。区别在于,第一个是在try/catch块中。

日志的结果:-

代码语言:javascript
复制
2021-07-09 12:04:38.344 W/System.err: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: mylist_data.ID (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
2021-07-09 12:04:38.348 W/System.err:     at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
2021-07-09 12:04:38.349 W/System.err:     at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
2021-07-09 12:04:38.349 W/System.err:     at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
2021-07-09 12:04:38.349 W/System.err:     at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
2021-07-09 12:04:38.349 W/System.err:     at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:51)
2021-07-09 12:04:38.349 W/System.err:     at androidx.room.EntityInsertionAdapter.insertAndReturnId(EntityInsertionAdapter.java:114)
2021-07-09 12:04:38.349 W/System.err:     at a.a.so67958704javaroomconvertexistingdb.AllDao_Impl.abort(AllDao_Impl.java:133)
2021-07-09 12:04:38.349 W/System.err:     at a.a.so67958704javaroomconvertexistingdb.AllDao.update4(AllDao.java:40)
2021-07-09 12:04:38.350 W/System.err:     at a.a.so67958704javaroomconvertexistingdb.AllDao_Impl.access$001(AllDao_Impl.java:22)
2021-07-09 12:04:38.350 W/System.err:     at a.a.so67958704javaroomconvertexistingdb.AllDao_Impl.update4(AllDao_Impl.java:159)
2021-07-09 12:04:38.350 W/System.err:     at a.a.so67958704javaroomconvertexistingdb.MainActivity.onCreate(MainActivity.java:78)
....
2021-07-09 12:04:38.353 D/BMINFO-D1: ID = 1 PostTitle = P1 PostURL =AnotherURL
2021-07-09 12:04:38.353 D/BMINFO-D1: ID = 2 PostTitle = P2 PostURL =U2
2021-07-09 12:04:38.353 D/BMINFO-D1: ID = 3 PostTitle = P3 PostURL =U3
2021-07-09 12:04:38.353 D/BMINFO-D1: ID = 4 PostTitle = P4 PostURL =U4
2021-07-09 12:04:38.355 D/AndroidRuntime: Shutting down VM
2021-07-09 12:04:38.358 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: a.a.so67958704javaroomconvertexistingdb, PID: 14230
    java.lang.RuntimeException: Unable to start activity ComponentInfo{a.a.so67958704javaroomconvertexistingdb/a.a.so67958704javaroomconvertexistingdb.MainActivity}: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: mylist_data.ID (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)

注意到第一个异常被捕获和打印,而不是致命的例外,第二个是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68307704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档