我创建了下面的存储过程,以便检查事务中的隔离级别行为:
我收到了这个错误信息:
在数据库'MyDataBase'中的事务失败,因为该语句在快照隔离下运行,但事务未在快照隔离下启动。 除非事务最初是在快照隔离级别下启动,否则无法在事务启动后将事务的隔离级别更改为快照。 在没有找到名称为t2的事务或保存点的情况下,无法回滚t2。
如果我删除事务并像普通存储过程一样运行,它就可以正常工作。
为什么会这样呢?
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的事务或保存点的情况下,无法回滚t2。
如果我删除事务并像普通存储过程一样运行,它就可以正常工作。
为什么会这样呢?