SQL Server如何在存储过程中处理关于事务的语句?
假设我有一个由多个独立的SELECT,INSERT,UPDATE和DELETE语句组成的存储过程。 没有明确的BEGIN TRANS / COMMIT TRANS / ROLLBACK TRANS逻辑。
SQL Server将如何处理这个存储过程事务明智? 每个陈述会有一个隐含的联系吗? 或者是否会有一个存储过程的事务?
另外,如何使用T-SQL和/或SQL Server Management Studio自己find这个问题?
谢谢!
只有一个连接,无论存储过程中有多less个SQL命令,都是用来运行该过程的。
由于存储过程中没有显式的BEGIN TRANSACTION,因此每个语句都将自行运行,如果有任何错误,则无法回滚任何更改。
但是,如果您在调用存储过程之前发出BEGIN TRANSACTION,则所有语句都归入一个事务中,并且可以在存储过程执行后进行COMMIT或ROLLBACK。
从存储过程中,您可以通过检查系统variables@@ 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个陈述(2个EXEC都是交易所涉及的陈述,1 + 5 + 1 + 5 = 12)。
你可以通过创build一个简单的小存储过程来自己找出问题,比如说插入一个logging到testing表中。 然后开始Tran; 运行sp_test; 回滚; 那里有新纪录吗? 如果是,那么SP忽略外部交易。 如果不是,那么SP就是交易内部执行的另一个语句(我很确定是这种情况)。