sql-server – 什么是僵尸交易?

我不小心发现SqlTransaction代码中提到了僵尸事务.那么,什么是僵尸交易?
僵尸事务是无法提交的事务(由于不可恢复的错误)但仍处于打开状态.

CREATE TABLE mytable (id INT NOT NULL PRIMARY KEY)
SET XACT_ABORT ON;
BEGIN TRY
        BEGIN TRANSACTION
                INSERT
                INTO    mytable
                VALUES  (1)
                INSERT
                INTO    mytable
                VALUES  (1)
        COMMIT
END TRY
BEGIN CATCH
        PRINT XACT_STATE()
        SELECT  *
        FROM    mytable
        ROLLBACK;
END CATCH
SELECT  *
FROM    mytable

这里,第二个INSERT渲染事务僵尸.

它不能再写了,应该回滚,但你仍然可以读取它的范围(最里面的SELECT返回一个记录;最外面的不返回).

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院