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).