令人郁闷的“事务中的变量赋值错误”

原创 2008年12月28日 02:56:00

 

         事务中的变量(包括表变量)的操作是不受事务控制的。但是反过来,事务中的变量操作失败,却会导致事务提交失败,这个有点让人郁闷。

         下面的脚本演示这个问题。示例演示分拆以逗号分隔的 @ids 中的每个 id 如果这个 id 是数字(int型),则做后面的处理;如果不是数字(赋值失败,进入CATCH块),则跳过这个id,处理下一个。整个处理在一个事务中进行。

DECLARE

    @ids varchar(1000);

SET @ids = '1,a,3,';

 

BEGIN TRY

    BEGIN TRAN;

   

    -- 循环分拆@ids 中以逗号分隔的每个id

    WHILE CHARINDEX(',', @ids) > 0

    BEGIN

       DECLARE

           @id int;

      

       BEGIN TRY

           -- 获取当前的id

           SET @id =LEFT(@ids, CHARINDEX(',', @ids) - 1);

       END TRY

       BEGIN CATCH

           -- @ids 中去掉当前的id

           SET @ids = STUFF(@ids, 1, CHARINDEX(',', @ids), '');

           CONTINUE;

       END CATCH

       -- @ids 中去掉当前的id

       SET @ids = STUFF(@ids, 1, CHARINDEX(',', @ids), '');

 

       -- 处理id

       RAISERROR('current id: %d', 10, 1, @id) WITH NOWAIT;

    END

   

    COMMIT TRAN;

END TRY

BEGIN CATCH

    IF XACT_STATE() <> 0

       ROLLBACK TRAN;

   

    SELECT

       err_line = ERROR_LINE(),

       err_message = ERROR_MESSAGE();

END CATCH

 

         这个脚本执行后,输出消息如下:

current id: 1

current id: 3

   err_line err_message

----------- -------------------------------------------------------

         30 当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。

 

(1 行受影响)

 

这个结果表明,@ids 中的所有 id 确实在循环中处理过,但第二个id由于不是数字,所以跳过了。但最终提交事务失败了,因为第二个id不是数字,导致赋值失败,从而导致事务不可提交。

发现这个问题是因为公司在用Service Broker传递业务数据,由于传递的xml数据有问题,导致类型不是期望有类型,从而使处理失败。

个人觉得这个问题有点令人讨厌,按照我的理解,既然不受事务控制,那么它也不应该反过来影响事务,可是结果与理解的不一样,值得注意。

最后补充一下:写这个的重点在于提醒大家,在事务处理中,不要忽略那些看起来与事务无关的处理,它们出错一样会影响事务的最终提交。当然,解决的办法是把这与事务无关的操作放在事务外(不过如果是存储过程嵌套,就不好控制)。另外一个,只要处理可能会在事务中,则出错时都抛出错误,而不试图忽略错误,这样可以解决问题。

Windows 系统错代码

0-操作成功完成。 1-函数不正确。 2-系统找不到指定的文件。 3-系统找不到指定的路径。 4-系统无法打开文件。 5-拒绝访问。 6-句柄无效。 7-存储控制块被损坏。 8-存储空...
  • applewangpai
  • applewangpai
  • 2013年06月21日 09:49
  • 46794

Spring Data JPA配置事务失效问题解决

最近在写自己的一个应用小项目时,ORM采用了Spring Data JPA,项目运行起来之初一些正常。但测试到事务的时候出现事务失效问题,后来查出是配置问题,问题出在采用扫描项目类时,未处理好组件范围...
  • javacspring
  • javacspring
  • 2015年01月06日 16:48
  • 3062

Spring控制多张数据表同时提交的事务操作

Spring控制多张表的提交事务操作   一.Spring配置文件如下:                           class="org.springframework.jdbc.data...
  • alexander_zhou
  • alexander_zhou
  • 2013年12月23日 21:54
  • 4670

MyEclipse使用过程中让我郁闷的错误

在使用MyEclipse开发过程中,经常会遇到这个莫名其妙的错误,之前的习惯是关掉软件,再创建新的工作目录,导致我电脑上的工作目录都有好多了                      根据网上的经...
  • w756058963
  • w756058963
  • 2016年12月28日 08:19
  • 103

关于数据库连接的一个郁闷错误

项目点击查询,或修改数据库后数据源连接溢出报错
  • u013116189
  • u013116189
  • 2015年12月10日 16:52
  • 227

abap编程中的事务代码和系统变量

  • 2010年11月08日 13:51
  • 15KB
  • 下载

令人无比郁闷的tcp Reset是如何产生的

前几天“温习”和“胡萝卜”一度在Google热门词汇里面排在前两位,因为大家发现只要搜索一下这两个词,竟然Google网站就被Reset了。神奇的国度总是有些稀奇古怪的事情! 看看这个Res...
  • q345852047
  • q345852047
  • 2012年03月05日 20:14
  • 7755

蹊跷的ThreadDeath,令人郁闷的glassfish

上周遇到的一个bug,ThreadDeath error,从而导致系统的每个请求都失败。能够让系统的每个traffic请求都失败的bug,这个严重程度不言而喻。看看是怎么回事吧? 其实问题的表现...
  • u013890660
  • u013890660
  • 2014年04月15日 10:31
  • 1336

oracle特有的错误:ORA-01036:非法的变量名/编号

  • 2011年03月16日 16:31
  • 20KB
  • 下载

修复Visual Studio控件不能添加变量错误

  • 2011年01月22日 14:35
  • 303B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:令人郁闷的“事务中的变量赋值错误”
举报原因:
原因补充:

(最多只允许输入30个字)