SQLiteDatabase嵌套事务和变通方法

sbe*_*zin 5 java sqlite android transactions

编辑:
是的,SQLite 不支持嵌套事务,但docs声明SQLiteDatabase 支持嵌套事务.
情况
我有一个包含事务的方法,我需要从另一个事务调用此方法.
此外 - 两个事务都在同一组记录上工作,但更新不同的列.
问题
看起来我的外部事务的结果被内部事务取消,仍然都被setTransactionSuccessful()标记为清理并由endTransaction()完​​成 - 我已经检查了这一点.
问题
- 知道为什么会这样吗?
- 是否有推荐的方式进行此类交易?

use*_*740 6

"嵌套Android事务" 使用SQLites嵌套事务/保存点支持.

相反,嵌套的Android事务会抑制显示SQLite事务.嵌套事务本身不能回滚,因为除了外部事务之外它不存在.这可以在这里看到mTransactionStack == null后卫.

只有这样,才能真正支持嵌套事务-这SQLite的支持,只是不能与开始/提交-是手动使用SAVEPOINT/RELEASE命令.当然,设计不依赖于此的代码将消除这需要的额外手动管理.

(我可能会将所有交易工作从实际的单个操作中移出,将管理层留给高级调用者;这对于UoW模式非常有效,但可能并不总是适用.)


laa*_*lto 5

您可以使用Android sqlite API嵌套事务,但需要注意:

事务可以嵌套.当外部事务结束时,该事务中完成的所有工作以及所有嵌套事务都将被提交或回滚.如果任何事务结束而没有标记为干净(通过调用setTransactionSuccessful),则将回滚更改.否则他们将被承诺.

我见过的另一种与sqlite一起使用的方法是传入一个布尔参数isInTransaction,该参数告诉被调用的方法它是应该自己处理事务,还是让调用者处理事务.