在处理事务的时候,一般都用RollBack Transaction来回滚,但是如果在嵌套事务中这样使用的话,就会出现错误。
在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。例如:
Begin Transaction -- @@TranCount = 1
BeginTransaction -- @@TranCount = 2
BeginTransaction -- @@TranCount = 3
Commit Transaction -- @@TranCount = 2
Commit Transaction -- @@TranCount = 1
Commit Transaction -- @@TranCount = 0
如果出现错误ROLLBACK TRANSACTION
则:
Begin Transaction -- @@TranCount = 1
BeginTransaction -- @@TranCount = 2
BeginTransaction -- @@TranCount = 3
ROLLBACK TRANSACTION -- @@TranCount = 0
Commit Transaction -- @@TranCount = 0---出现错误
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
如果被嵌套的事务中发生错误,最简单的方法应该是无论如何都先将它提交,同时返回错误码(一个正常情况不可能出现的代码 如 -1)让上一层事务来处理这个错误,从而使@@TranCount 减1。 这样外层事务在回滚或者提交的时候能够保证外层事务在开始的时候和结束的时候保持一致。由于里层事务返回了错误码,因此外层事务(最外层)可以回滚事务,这样里面已经提交的事务也可以被回滚而不会出现错误。
在项目中应该会常常出现这样的情况,一个存储过程里面用了事务,但是不能保证它会被别的带有事务的存储过程调用,如果单独调用的话,出现错误可以直接回滚,但是如果是被别的带事务的存储过程调用的话,RollBack 就会出错了。因此需要一种机制来区分,建立一个临时的变量来区分是否嵌套,和嵌套的层数,如下:
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
SAVE TRANSACTION ProcedureSave;
ELSE
BEGIN TRANSACTION;
…………
--事务内要执行的代码
…………
IF @@ERROR<>0
goto Error
Commit Transaction
Commit Transaction
--下面返回要返回的值0只是个例子
Return 0
Error:
IF @TranCounter = 0
ROLLBACK TRANSACTION;
Else
ROLLBACK TRANSACTION ProcedureSave;
Return @Error
分享到:
相关推荐
每当开始一个事务,`@@TRANCOUNT`增加1,每当我们提交或回滚一个事务,`@@TRANCOUNT`减少1。当`@@TRANCOUNT`降回0时,表示没有活动的事务。嵌套事务的提交依赖于最外层的事务,只有最外层事务提交,内部事务才会被...
- **@@trancount**: 当前活动事务的数量。 ##### 5. 主逻辑 ```sql -- Example1: 错误处理 select @Error = @@error, @RowCount = @@rowcount if (@Error <> 0) goto error -- Example2: 条件判断 if (@RowCount =...
该文档从sqlserver事务讲起,详述ACID,@@trancount,在嵌套事务中使用保存点,命名事务等
如果在嵌套事务中,`COMMIT`会使`@@TRANCOUNT`递减1,但不会完全还原到0,直到最外层的事务被提交或回滚。 4. **事务回滚**: `ROLLBACK TRANSACTION`用于撤销事务中的所有更改,将数据库状态回滚到事务开始时的...
这会增加`@@TRANCOUNT`计数器的值,表示当前事务的层级。 - **事务名称**:可选地,可以为事务指定一个名称,便于管理和跟踪。名称限制为32个字符以内,且在嵌套事务中,最外层事务的名称是必需的。 - **事务标记*...
IF @@TRANCOUNT > 0 ROLLBACK TRAN END CATCH IF @@TRANCOUNT > 0 COMMIT TRAN ``` 此外,存储过程`dbo.pr_tran_inproc`展示了如何在存储过程中使用事务处理。它首先关闭返回行计数(`SET NOCOUNT ON`),然后...
`@@TRANCOUNT`返回当前会话中打开的事务数量。这对于确保正确的事务处理和数据一致性至关重要。 #### 15. `@@VERSION` `@@VERSION`返回SQL Server的版本信息。这对于环境配置检查或解决兼容性问题非常有用。 ####...
Contents Overview 1 Lesson 1: Concepts – Locks and Lock Manager 3 Lesson 2: Concepts – Batch and Transaction 31 Lesson 3: Concepts – Locks and Applications 51 Lesson 4: Information Collection and ...
在`CATCH`块中,可以通过检查`@@TRANCOUNT`来决定是否需要回滚事务。示例: ```sql BEGIN TRY BEGIN TRAN UPDATE statement 1 ... DELETE statement 2 ... END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ...
IF @@TRANCOUNT > 0 ROLLBACK TRAN END CATCH IF @@TRANCOUNT > 0 COMMIT TRAN ``` **知识点说明**: - `BEGIN TRAN` 开始一个新的事务。 - `BEGIN TRY...BEGIN CATCH` 结构用于事务内的错误处理。 - `ROLLBACK ...
- **开始事务**:使用`BEGIN TRANSACTION`语句开始一个新的事务,这会增加`@@TRANCOUNT`计数器。 - **事务命名**:可以为事务指定一个名称,方便在多个嵌套事务中跟踪和管理。 - **事务提交**:`COMMIT ...
26. `@@TRANCOUNT`:返回当前会话中活跃的事务数,对事务管理至关重要。 通过查询这些全局变量,SQL Server管理员可以有效地监控系统状态、诊断问题和优化性能。例如,检查`@@CPU_BUSY`和`@@IDLE`可以帮助识别CPU...
IF (@@trancount > 0) begin raiserror(15002,-1,-1,'sp_password') return (1) end -- RESOLVE LOGIN NAME (disallows nt names) if not exists (select * from master.dbo.syslogins where loginname = @...
27. **@@TRANCOUNT**:返回当前会话中活动事务的数量,对管理和控制事务流很有帮助。 这些全局变量是SQL Server管理员和开发人员的重要工具,它们提供了丰富的系统状态信息,有助于诊断问题、优化性能和编写更智能...
IF (@@TRANCOUNT > 0) BEGIN RAISERROR (15002, -1, -1, 'sp_password'); RETURN (1); END; -- RESOLVE LOGIN NAME (disallows NT names) IF NOT EXISTS (SELECT * FROM WHERE loginname = @loginame AND ...
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; -- 处理错误信息 END CATCH ``` 在这个例子中,我们使用了BULK INSERT导入CSV文件,并通过指定批处理大小来控制每次导入的数据量。注意,你需要替换'`SourceFilePath....
@@TRANCOUNT 是一个SQL Server中的系统变量,用于跟踪当前会话中的事务数量。在事务开始时,该值会增加1;当事务结束(提交或回滚)时,该值会减少1。 3. **事务边界** 事务可以显式定义(例如,使用BEGIN ...
* 验证和确认@@transtate/@@trancount/@@isolation * 验证和确认锁定模式share/exclusive * 验证和确认服务器/所有者命名约定 * 验证和确认重新编译选项 * 验证和确认业务逻辑 * 验证和确认对象依赖关系 * 验证和...
9. **事务处理**:`BEGIN distributed transaction`开始一个事务,`COMMIT TRANSACTION`提交事务,`@@TRANCOUNT`检查当前的事务计数。 10. **字符串连接**:可以使用加号(+)来连接字符串,如`SET @m_sql = @m_sql +...