Android SQLite相关java源码中多次提到支持 nested transaction。
而SQLite本身不支持嵌套事务,只能使用 savepoint 代替。 https://www.sqlite.org/lang_savepoint.html
嵌套事务即是类似于
BEGIN
BEGIN
......
也许没有太多人会直接这样写,更多情况是,一个程序执行事务中调用了其他程序,而其他程序有自己的事务。
通过查看Android源码发现:
Android所谓的支持嵌套事务,只是屏蔽掉子事务的 begin end,只有最外层事务的begin end 有效。同时,子事务出错会导致整个嵌套事务出错,整个回滚。
当然,SQL SERVER好像也没有支持真正的嵌套事务,了解不太详细。
--------------------------------------------------------------------------------------
Android SQLite 关于嵌套事务的处理,均位于SqliteSession,多数数据库相关操作的调用流程均为 SQLiteDataBase --> SqliteSeesion --> SqliteConnectionPool --> SqliteConnection。稍后详细分析。只需知道,SQLiteDatabase.beginTransacion() 调用的是SQLiteSeesion.beginTransacion(),其他类似。如下
public void beginTransaction() {
beginTransaction(null, true);
}
private void beginTransaction(SQLiteTransactionListener transactionListener, boolean exclusive) {
acquireReference();
try {
getThreadSession().beginTransaction( //--- 获取线程session,开始事务
exclusive ? SQLiteSession.TRANSACTION_MODE_EXCLUSIVE :
SQLiteSession.TRANSACTION_MODE_IMMEDIATE,
transactionListener,
getThreadDefaultConnectionFlags(false /*readOn

Android SQLite 实际上并不支持嵌套事务,而是通过savepoint来模拟。内部通过SQLiteSession管理事务,当调用beginTransaction时,只有最外层的BEGIN会执行,子事务的begin和end被屏蔽。如果子事务出错,会回滚整个嵌套事务。setTransactionSuccessful()和endTransaction()配合判断事务是否成功并决定提交或回滚。yield在嵌套事务中可能导致事务意外标记为成功,因此不推荐使用。
最低0.47元/天 解锁文章
10万+

被折叠的 条评论
为什么被折叠?



