/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

解决COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION错误

2013-12-09 十有三 1 浏览:4万+ 数据库 SQL Server | 异常处理

今天在做项目时,由于业务需求,需要在SQL语句的事务中添加条件判断,不符合条件则跳出事务进行回滚,但是在执行了SQL语句后,系统提示异常错误:COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

错误截图:COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION

以下是出现错误的SQL部分语句:

BEGIN TRAN
--进行判断,不符合条件就回滚,不执行其他操作
IF NOT EXISTS(SELECT [ID] FROM [TestTable] WHERE NO='123')
BEGIN
ROLLBACK TRAN;
END

--这里执行其他SQL操作语句。
UPDATE TestTable SET NO='312' WHERE NO='122'

--如果有错误就回滚,没错误就提交
IF(@@ERROR<>0)
BEGIN  
     ROLLBACK TRAN;
END
ELSE
BEGIN
     COMMIT TRAN;
END

此错误的原因是由于一个事务只能对应一个操作,要么回滚要么提交,所以执行了ROLLBACK TRAN语句后一定不能再执行COMMIT TRAN语句!!!而无论是回滚事务还是提交事务,都是不会中断SQL处理流程的,要想中断流程就需要使用RETURN语句。

上面范例中的语句先执行了ROLLBACK TRAN回滚操作(这里造成事务已经处理完成),但是并没有中断流程,所以后面的语句依然会继续执行。执行过程中由于没有任何异常错误,最终导致重复执行了底部的COMMIT TRAN事务提交操作,最后一次事务操作没有找到相匹配的事务声明,就会提示"COMMIT TRANSACTION(事务提交) 请求没有对应的 BEGIN TRANSACTION(事务声明)"这个错误。

所以要跳出事务,在进行回滚ROLLBACK操作后,还必须马上使用RETURN语句跳出执行流程。以下为修改后的语句:

BEGIN TRAN
--进行判断,不符合条件就回滚,不执行其他操作
IF NOT EXISTS(SELECT [ID] FROM [TestTable] WHERE NO='123')
BEGIN
     ROLLBACK TRAN;
     --------------------------------
     --这里需要添加RETURN,中断处理流程,防止重复执行事务提交!
     RETURN;
     --------------------------------
END

--这里执行其他SQL操作语句。
UPDATE TestTable SET NO='312' WHERE NO='122'

--如果有错误就回滚,没错误就提交
IF(@@ERROR<>0)
BEGIN
     ROLLBACK TRAN;
END

ELSE
BEGIN  
     COMMIT TRAN;
END

这里在做一个简单测试,有助于理解所谓的一个事务只能对应一个事务操作的意思,在SQL中输入下图的三行代码并执行:

简单测试还原错误

事务的语法只能一一对应,我们只有一个事务声明但是却有两个事务操作,最后一个事务操作无法找到匹配的事务声明,自然就出错。


作者:十有三

出处:https://shiyousan.com/post/f13d29b7-0d87-4168-bd8b-8b28b0991b5a

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: 解决"在页面head部分没有发现字符集定义,请增加该说明"的问题
  • 下一篇: 解决操作系统任务栏中谷歌浏览器chrome图标变成QQ图标

相关文章
  • 解决SQL Service创建链接服务器出现(null) 是无效的产品名称的问题
  • MongoDB小技巧:在命令提示符中通过任意路径执行MongoDB命令
  • 创建 SQL Server Express自动备份数据库功能
  • SQL Service 2008 SQL语句 四舍五入保留两位小数
  • MongoDB学习笔记:解决编写.mongorc.js脚本无效的问题
  • 使用sqlcmd命令执行带参数的存储过程

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • MIME 类型大全(收集常用的MIME Type)
  • SQL 获取下一条数据
  • Visual Studio中的.suo(Solution User Options)文件
  • 修改Discuz!NT源码出现'List' is an ambiguous reference(即不明确的引用)错误
  • HTTP 错误 404.17 - Not Found请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号