Android SQLite 支持嵌套事务吗?

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

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值