SQL 嵌套事务

Posted

技术标签:

【中文标题】SQL 嵌套事务【英文标题】:SQL Nested transaction 【发布时间】:2015-09-12 07:54:36 【问题描述】:

需要解释以下查询。 在提交外部事务 T 时,该行已被嵌套事务删除。但仍然选择并显示 ID 为 2 的值。

BEGIN TRAN T
SELECT * from tbl_types where ID=2

    BEGIN TRAN nested
       DELETE from tbl_types where ID=2
    COMMIT TRAN nested

COMMIT TRAN T

【问题讨论】:

见execution plan,这是正常的顺序 这是关于“脏读”的。考虑阅读***.com/questions/20840/… 【参考方案1】:

第一个选择的结果集已经发送回客户端

从那以后发生了什么并不重要; next 查询将找不到自删除记录的匹配项。

这只是与语句排序有关。以下,没有任何嵌套/显式事务,将产生相同的结果:

SELECT * from tbl_types where ID=2
DELETE from tbl_types where ID=2

虽然这不会返回任何结果:

DELETE from tbl_types where ID=2
SELECT * from tbl_types where ID=2

【讨论】:

以上是关于SQL 嵌套事务的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 - 无法回滚嵌套事务

事务嵌套问题总结-rollback-only异常

SQL 嵌套查询和使用 MAX 提取最近的事务和/或评论

TransactionScope:具有不同数据库连接的嵌套事务(SQL Server 和 Postgresql)

使用 JDBC 3.0 实现对嵌套事务的支持

关于调用方有事务,被调用的SP中也有事务,在嵌套SP中回滚代码的报错处理,好文推荐