当前位置: 首页 > 面试题库 >

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

曾苗宣
2023-03-14
问题内容

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

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

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

谢谢!


问题答案:

无论存储过程中有多少个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)。



 类似资料:
  • 问题内容: 我的存储过程的基本结构是 MySQL版本: 5.1.61-0ubuntu0.11.10.1-log 当前,如果“查询2”失败,则提交“查询1”的结果。 如果任何查询失败,如何回滚事务? 问题答案: 看看http://dev.mysql.com/doc/refman/5.0/en/declare- handler.html 基本上,您声明错误处理程序,它将调用回滚

  • 本文向大家介绍MSSQL事务的存储过程,包括了MSSQL事务的存储过程的使用技巧和注意事项,需要的朋友参考一下 在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType             房间表:Room   首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rType

  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 我能够在下面的SQL Server 2008 R2中创建存储过程,但现在遇到了困难,因为我需要以存储过程将使用事务并检查insert语句中的错误的方式来进行创建。当发现错误时-事务应该回滚,并且不应该提交任何东西。如有任何帮助,我们将不胜感激。 使用Northwind GO CREATE PROC spEmployee@employeeId int作为SELECT*FROM employees W

  • 我有一个用例,我需要从一个Kafka主题中消费,做一些工作,生成另一个只有一次语义的Kafka主题,并保存到mongo数据库。看完文档后,我想kafka事务和mongo事务可以同步,但它们仍然是两个不同的事务。在下面的场景中,如果mongo提交失败,是否有方法回滚提交到主题并从消费者处重播的kafka记录。

  • 我需要在我的存储过程中添加错误处理。我相信当只有一个insert语句时,通常不需要使用BEGIN TRAN/COMMIT TRAN。还有使用SET XACT_ABORT,NOCOUNT ON语句的意义是什么。请给出最佳/标准的方法将错误处理添加到下面的SP中。如果出现错误,我还需要在catch段中调用dbo.usp_get_error_info。请建议。