ormLite callInTransaction 是否锁定数据库?
Does ormLite callInTransaction lock the database?
我想知道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 可能会尝试在 createOrUpdate(pairAA)
和 createOrUpdate(pairBB)
之间执行 queryAll()
。这意味着 AA 变为 2,查询读取时 BB 仍为 1。还是事务管理器会在可调用对象的整个执行过程中锁定 table/database,从而使查询不可能发生(只允许在可调用对象之前或之后进行查询)?
TransactionManager.callInTransaction()
在 call() 方法执行后关闭自动提交和提交更改,如果 call() 方法抛出异常则回滚它们。
所以不可能得到您描述的 queryAll()
的情况。
另外 Android SQLite 允许多个读者,但一次只允许一个作者详细信息:
我想知道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 可能会尝试在 createOrUpdate(pairAA)
和 createOrUpdate(pairBB)
之间执行 queryAll()
。这意味着 AA 变为 2,查询读取时 BB 仍为 1。还是事务管理器会在可调用对象的整个执行过程中锁定 table/database,从而使查询不可能发生(只允许在可调用对象之前或之后进行查询)?
TransactionManager.callInTransaction()
在 call() 方法执行后关闭自动提交和提交更改,如果 call() 方法抛出异常则回滚它们。
所以不可能得到您描述的 queryAll()
的情况。
另外 Android SQLite 允许多个读者,但一次只允许一个作者详细信息: