/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • 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 2008 SQL语句 四舍五入保留两位小数
  • 解决SQL SERVER还原数据库错误:备份介质集不完整。介质簇计数: 2。缺失的介质簇序列号: 1
  • SQL查询当前数据上一条和下一条的数据以实现获取文章上下篇文章信息
  • 记录MongoDb连接错误System.TimeoutException: A timeout occured after 30000ms selecting a server
  • MongoDB学习笔记:28663 Cannot start server. The default storage engine 'wiredTiger' is not available
  • System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部

文章分类

.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重构重命名的快捷键

推荐文章

  • ASP.NET MVC 如何防御CSRF攻击(跨站请求伪造)
  • Win10 自动换壁纸软件失效-无法换壁纸并被强制切换为默认壁纸
  • 安卓onenote出现错误代码80a00010导致无法登陆
  • GitHub Desktop下载失败 无法启动应用程序
  • 解决VirtualBox-Error Failed to open a session for the virtual machine错误

友情链接

  • Passingwind的博客
  • 码友网

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