【发布时间】:2018-01-15 22:47:23
【问题描述】:
我创建了以下存储过程来检查事务中的隔离级别行为:
CREATE PROCEDURE ReadCommittedIsolationLevel
AS
BEGIN
BEGIN TRANSACTION t1
BEGIN TRY
EXEC SnapShotIsolationLevel
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK TRANSACTION t1
END CATCH
END
CREATE PROCEDURE SnapShotIsolationLevel
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION t2
BEGIN TRY
SELECT TOP 20 *
FROM Orders
ORDER BY 1 DESC
COMMIT
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK TRAN t2
END CATCH
END
然后我运行这个:
EXEC ReadCommittedIsolationLevel
我收到此错误:
数据库“MyDataBase”中的事务失败,因为该语句在快照隔离下运行,但事务未在快照隔离下启动。事务启动后,您不能将事务的隔离级别更改为快照,除非该事务最初是在快照隔离级别下启动的。
无法回滚 t2。未找到该名称的事务或保存点。
如果我删除事务并像普通存储过程一样运行它,它就可以正常工作。
这是为什么呢?
【问题讨论】: