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

Sle*_*ess 42 sql sql-server stored-procedures transactions

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

SQL Server如何以事务方式处理此存储过程?每个语句都会有隐式连接吗?或者存储过程会有一个事务吗?

另外,我怎么能使用T-SQL和/或SQL Server Management Studio自行找到它?

谢谢!

KM.*_*KM. 33

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

由于存储过程中没有明确的BEGIN TRANSACTION,因此每个语句都将自行运行,如果出现任何错误,则无法回滚任何更改.

但是,如果在调用存储过程之前发出BEGIN TRANSACTION,则所有语句都在事务中分组,并且可以在存储过程执行后进行COMMITted或ROLLBACK.

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

如果您执行以下操作:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT
Run Code Online (Sandbox Code Playgroud)

事务中的所有内容都由事务涵盖,所有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
Run Code Online (Sandbox Code Playgroud)

事务涵盖了两个过程调用中的所有内容,所有12个语句(2个EXEC都是事务所涵盖的语句,1 + 5 + 1 + 5 = 12).

  • @Sleepless,编辑窗口上方有一个工具栏,突出显示代码的完整部分,然后单击101010图标,它将在预览窗口中显示为代码.我通常使用编辑器在我的PC上编写代码,然后缩进所有4个空格,当我将其粘贴到此站点的编辑器中时,它会自动显示为代码.另外,点击橙色帮助"?" 图标,这是链接:http://stackoverflow.com/editing-help (2认同)