3902: The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION(COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION)
SQL Server含义
执行了 COMMIT TRANSACTION,但没有对应的已打开的 BEGIN TRANSACTION。由于事务计数(@@TRANCOUNT)为零,找不到可提交的事务。
原因
BEGIN/COMMIT/ROLLBACK 使用不平衡、事务已在出错后回滚、嵌套事务计数管理不当,或在 CATCH 块中 ROLLBACK 之后再次调用 COMMIT。
解决方法
使 BEGIN 与 COMMIT 语句的数量平衡。提交前检查 @@TRANCOUNT(IF @@TRANCOUNT > 0 COMMIT)。在 TRY...CATCH 中,出错时根据 XACT_STATE()/@@TRANCOUNT 执行 ROLLBACK,并避免不必要的 COMMIT。审查嵌套事务逻辑。
同一数据库的其他条目
- 2714There is already an object named in the database(数据库中已存在名为 ... 的对象)
- 601Could not continue scan with NOLOCK due to data movement(由于数据移动,无法继续以 NOLOCK 方式扫描)
- 50000用 RAISERROR 引发的自定义错误
- 1101Could not allocate a new page because of insufficient disk space in filegroup(文件组磁盘空间不足,无法分配新页)
- 3729Cannot DROP because it is being referenced by object(无法 DROP,因为它正被对象引用)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement(快照隔离事务失败,因为对象已被 DDL 语句修改)
- 1785Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths(引入 FOREIGN KEY 约束可能导致循环或多重级联路径)