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 /*readO