`
javayestome
  • 浏览: 1029312 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

下面的脚本演示这个问题。示例演示分拆以逗号分隔的 @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数据有问题,导致类型不是期望有类型,从而使处理失败。

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

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

分享到:
评论

相关推荐

    WinCC PRO V16使用C脚本给变量赋值的具体方法.docx

    本文将详细介绍如何在WinCC PRO V16中使用C脚本来给变量赋值。 首先,我们要明白在WinCC PRO V16中,C脚本的使用主要是为了执行特定的逻辑操作,如数据处理、控制逻辑和与PLC的交互等。C语言的灵活性和高效性使其...

    动态给fastreport报表中的变量赋值

    在这个特定的问题中,我们要探讨的是如何在FastReport报表中动态地为变量赋值,这是一个常见的需求,尤其是在处理动态数据或者需要根据用户输入调整报告内容时。 首先,让我们理解FastReport的工作原理。FastReport...

    回归分析中变量的赋值

    哑变量是一种二元变量,通常取值为0或1,用于表示分类变量中的某一特定水平是否出现。例如,在研究中若涉及性别这一分类变量,可以设定两个哑变量,分别代表男性和女性,其中男性哑变量(Male)=1表示个体为男性,0...

    易语言置入变量赋值

    "置入变量赋值"就是将某个值放入已经声明的变量中,即改变变量的当前值。在易语言中,这通常通过“赋值”操作符“=”来完成。 二、易语言中的变量类型 易语言支持多种基本数据类型,包括整型、实型(浮点数)、字符...

    spss变量赋值分两组

    在SPSS16.0中,变量赋值通常是通过“数据”菜单下的“定义变量”功能实现的。用户可以为已有的变量设置新的值,或者创建新的变量。这一过程可能包括将数值变量转换为类别变量,或者根据某些条件对变量进行重新编码。...

    数控宏程序变量赋值试题[参照].pdf

    数控宏程序变量赋值是数控编程中的一个重要概念,它涉及到一系列高级编程技巧,用于实现复杂的自动化加工任务。在数控系统中,宏程序允许用户通过变量来动态改变程序的行为,提高程序的灵活性和重用性。 1. 变量...

    TIA博途中触摸屏如何通过按钮对变量进行赋值操作?.docx

    例如,如果我们要将PLC中的变量“Var1”赋值为10,脚本可以写成:“SetValue(Var1, 10)”。 5. **保存和编译**: 输入完成后,记得保存你的改动。在主菜单中选择“项目” -&gt; “编译”来检查是否有语法错误或逻辑...

    springboot 使用yml配置文件给静态变量赋值教程

    在这个教程中,我们将学习如何使用`yml`配置文件为静态变量赋值,特别是针对像数据查询引擎连接工具类这样的场景。 首先,我们需要在`yml`配置文件中定义所需的参数。以`clickhouse`为例,我们会在`application.yml...

    C++在函数中给类的指针变量赋值问题

    ### C++中函数内给类的指针变量赋值问题详解 #### 一、问题背景与分析 在C++编程中,指针的使用是非常常见的,尤其是在处理复杂数据结构或对象时。本文针对一个具体的场景——在函数内部给类的指针变量赋值时遇到...

    Qt从数据库中提取数据给变量赋值

    Qt中执行sql语句,当需要变量存取从数据库中获取的值,首先取出一行数据,然后按列将数据分别赋给变量

    SQL变量声明和赋值知识归纳

    在SQL编程中,变量的声明与赋值是构建复杂查询和流程控制的基础。本文将深入探讨SQL中的变量声明和赋值方法,旨在为初学者提供一个全面的理解框架,同时为有经验的开发者提供一个快速回顾的平台。 ### SQL变量声明 ...

    编译原理表达式运算-实现四则运算,赋值预算,变量赋值

    在C语言中,赋值操作符`=`右侧的表达式计算完成后,结果会存储到左侧变量中。在Yacc文法中,这通常表现为一个规则,如`assign: ID '=' expr ';'`,其中`ID`是变量标识符,`expr`是赋值表达式。解析器会生成相应的C...

    c# 变量反射使用赋值

    在本案例中,我们将探讨如何利用反射来实现变量的动态赋值,特别是在WPF(Windows Presentation Foundation)应用程序中的应用。 首先,理解C#中的变量。变量是存储数据的容器,它们有特定的数据类型,例如int、...

    mysql 存储过程中变量的定义与赋值操作

    一、变量的定义 mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin…end 块中使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default...

    超详细讲C++变量赋值

    超详细讲C++变量赋值

    自动变量赋值工具(更新)

    自动给变量赋值

    C语言中如何一次给多个变量键盘赋值.cpp

    初学者C语言

    分析 JavaScript 中令人困惑的变量赋值

    在 JavaScript 中,变量赋值看似简单,但实际上却存在一些潜在的陷阱,能够导致开发者的困惑和混乱。 JavaScript 是一门弱类型语言,声明变量不需要声明其类型,var x 就可以等于任何类型的值。这使得开发者容易陷入...

    【Python入门学习】详谈python变量和变量赋值语句

    序列解包赋值是一种高效的方式,如`name, age = 'Lilly', 22`,它允许你将元组或列表中的元素分别赋值给一组变量,但要注意两边的元素数量必须相等,否则会导致语法错误。 最后,我们来谈谈变量使用中可能遇到的...

    sqlserver存储过程中SELECT 与 SET 对变量赋值的区别

    在编写存储过程时,我们经常需要对变量进行赋值,这时就涉及到`SET`和`SELECT`两种不同的赋值方式。尽管两者都可以用来对变量进行赋值,但它们之间存在一些关键区别。 首先,SQL Server官方推荐在对单个变量赋值时...

Global site tag (gtag.js) - Google Analytics