Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server如何处理存储过程中与事务相关的语句?_Sql_Sql Server_Stored Procedures_Transactions - Fatal编程技术网

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

SQL Server如何处理存储过程中与事务相关的语句?,sql,sql-server,stored-procedures,transactions,Sql,Sql Server,Stored Procedures,Transactions,假设我有一个由几个单独的SELECT、INSERT、UPDATE和DELETE语句组成的存储过程。没有显式的BEGIN TRANS/COMMIT TRANS/ROLLBACK TRANS逻辑 SQL Server将如何处理此存储过程事务?每个语句都有隐式连接吗?或者存储过程将有一个事务 另外,我是如何使用T-SQL和/或SQL Server Management Studio自己发现这一点的 谢谢 您可以通过创建一个简单的小存储过程(例如,在测试表中插入一条记录)自己找到答案。然后开始训练;运行

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

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

另外,我是如何使用T-SQL和/或SQL Server Management Studio自己发现这一点的


谢谢

您可以通过创建一个简单的小存储过程(例如,在测试表中插入一条记录)自己找到答案。然后开始训练;运行sp_测试;回降;有新唱片吗?如果是,则SP将忽略外部事务。如果不是,则SP只是事务内部执行的另一条语句(我很确定是这样的)。

只有一个连接,它是用来运行过程的,不管存储过程中有多少SQL命令

由于存储过程中没有显式的BEGIN事务,因此每个语句都将独立运行,如果出现任何错误,则无法回滚任何更改

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

在存储过程中,您可以通过检查系统变量的值来确定是否在事务中运行。零表示没有事务,其他任何内容都显示您所处的嵌套级别的事务数。根据您的sql server版本,您也可以使用

如果您执行以下操作:

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

您必须了解事务是会话的一种状态。会话可以处于显式事务状态,因为在抛出命令“BEGIN transaction”的位置(在进入例程或例程代码之前),会话中至少执行了一个BEGIN事务。否则,会话的状态为隐式事务状态。您可以有多个BEGIN事务,但只有第一个事务会更改会话的行为。。。其他变量仅增加@TRANCOUNT全局sesion变量


隐式事务状态意味着所有SQL命令(DDL、DML和DCL命令)都将有一个不可见的集成事务作用域。

因此,实际上,存储过程中的每个语句都会形成自己的事务,也就是说,一个内部有五条语句的存储过程会在五个事务中执行?如果该过程中没有事务,或者该过程外部没有事务,那么该过程中的每条语句都是一个自治的工作单元。实际上没有事务,因为您不能提交或回滚。如果将过程调用包装到事务中,那么过程中的所有内容都将在该事务中执行。谢谢!顺便说一句,你是怎么做的?我显然在代码格式化方面失败了。@Sleepless,编辑窗口上方有一个工具栏,突出显示代码的完整部分,然后单击101010图标,它将作为代码显示在预览窗口中。我通常使用编辑器在电脑上编写代码,然后将所有内容缩进4个空格,当我将其粘贴到该站点的编辑器中时,它会自动显示为代码。另外,单击橙色的“帮助”?“图标,下面是链接:如果附加的
开始事务
语句只执行增量
@@TRANCOUNT
-计算您发出
开始事务
的次数有什么意义?因为这是一种知道您是否处于事务状态的方法。当@TRANCOUT超过0时,会话的状态为事务性,而当@TRANCOUT=0时,会话的状态为事务性。还要知道在真正提交事务之前必须执行多少次提交。