SQL Server如何处理存储过程中有关事务的语句?

说我有一个存储过程,该过程由几个单独的SELECT,INSERT,UPDATE和DELETE语句组成。 没有明确的BEGIN TRANS / COMMIT TRANS / ROLLBACK TRANS逻辑。

SQL Server将如何以事务方式处理此存储过程? 每个语句都会隐式连接吗? 还是存储过程会有一笔交易?

另外,如何使用T-SQL和/或SQL Server Management Studio独自发现这一点?

谢谢!

2个解决方案
33 votes

无论存储过程中有多少个SQL命令,都将只有一个连接,它是用于运行过程的连接。

由于在存储过程中没有显式的BEGIN TRANSACTION,因此每个语句将独立运行,并且如果有任何错误,将无法回滚任何更改。

但是,如果在调用存储过程之前发出了BEGIN TRANSACTION,则所有语句都将在事务中进行分组,并且可以在存储过程执行后被提交或回滚。

在存储过程中,可以通过检查系统变量@@ TRANCOUNT(Transact-SQL)的值来确定您是否在事务中运行。 零表示没有事务,其他任何东西都表明您处于多少嵌套级别。根据您的SQL Server版本,您也可以使用XACT_STATE(Transact-SQL)。

如果您执行以下操作:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

事务覆盖了过程中的所有内容,全部包含6条语句(EXEC是事务覆盖的语句,1 + 5 = 6)。 如果您这样做:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1
EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

两个过程调用中的所有内容都被事务覆盖,所有12条语句(两个EXEC都被事务覆盖,1 + 5 + 1 + 5 = 12)。

KM. answered 2020-08-12T03:38:58Z
1 votes

您可以通过创建一个小的存储过程来自己找出答案,该存储过程做一些简单的事情,例如将记录插入测试表中。 然后开始Tran; 运行sp_test; 回滚 新唱片在那里吗? 如果是这样,则SP将忽略外部事务。 如果不是,则SP只是事务内部执行的另一条语句(我很确定是这种情况)。

MJB answered 2020-08-12T03:39:19Z
translate from https://stackoverflow.com:/questions/2622069/how-does-sql-server-treat-statements-inside-stored-procedures-with-respect-to-tr