我意外发现zombie transaction
代码中提到了SqlTransaction
。那么,什么是僵尸交易?
答案 0 :(得分:8)
僵尸事务是一个无法提交的事务(由于不可恢复的错误),但仍处于打开状态。
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
返回一条记录;最外面的不返回)。