ormLite callInTransaction会锁定数据库吗?

时间:2015-01-08 16:16:31

标签: java android ormlite

我想知道ormLite在执行事务时是否锁定了数据库。我有桌子:

key | value
AA  | 1
BB  | 1

我有两个数据库操作在运行。一个修改多个条目:

new Callable<Void>() {
    public Void call() throws SQLException {
        pairAA = new DbEntry("AA", 2);
        pairBB = new DbEntry("BB", 2);
        dao.createOrUpdate(pairAA);
        dao.createOrUpdate(pairBB);

        return null;
    }
}

如果我尝试在不同的主题上运行第一个,使用TransactionManager.callInTransaction()sumAllValues(dao.queryAll())可能会获得3吗?在不同线程上运行意味着JVM可能会尝试在queryAll()createOrUpdate(pairAA)之间执行createOrUpdate(pairBB)。这意味着AA变为2,当查询读取时BB仍为1。或者事务管理器是否会锁定该表/数据库以执行可调用的整个操作,从而使查询无法进行(仅在可调用之前或之后允许它)?

1 个答案:

答案 0 :(得分:1)

TransactionManager.callInTransaction()关闭自动提交并在执行call()方法后提交更改,如果call()方法抛出异常,则将其回滚。

所以你不可能得到你所描述的queryAll()的情况。 此外,Android SQLite允许多个读者,但一次只有一个作者:https://stackoverflow.com/a/7740305/2055854