事务中的变量(包括表变量)的操作是不受事务控制的。但是反过来,事务中的变量操作失败,却会导致事务提交失败,这个有点让人郁闷。
下面的脚本演示这个问题。示例演示分拆以逗号分隔的 @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脚本来给变量赋值。 首先,我们要明白在WinCC PRO V16中,C脚本的使用主要是为了执行特定的逻辑操作,如数据处理、控制逻辑和与PLC的交互等。C语言的灵活性和高效性使其...
在这个特定的问题中,我们要探讨的是如何在FastReport报表中动态地为变量赋值,这是一个常见的需求,尤其是在处理动态数据或者需要根据用户输入调整报告内容时。 首先,让我们理解FastReport的工作原理。FastReport...
哑变量是一种二元变量,通常取值为0或1,用于表示分类变量中的某一特定水平是否出现。例如,在研究中若涉及性别这一分类变量,可以设定两个哑变量,分别代表男性和女性,其中男性哑变量(Male)=1表示个体为男性,0...
"置入变量赋值"就是将某个值放入已经声明的变量中,即改变变量的当前值。在易语言中,这通常通过“赋值”操作符“=”来完成。 二、易语言中的变量类型 易语言支持多种基本数据类型,包括整型、实型(浮点数)、字符...
在SPSS16.0中,变量赋值通常是通过“数据”菜单下的“定义变量”功能实现的。用户可以为已有的变量设置新的值,或者创建新的变量。这一过程可能包括将数值变量转换为类别变量,或者根据某些条件对变量进行重新编码。...
数控宏程序变量赋值是数控编程中的一个重要概念,它涉及到一系列高级编程技巧,用于实现复杂的自动化加工任务。在数控系统中,宏程序允许用户通过变量来动态改变程序的行为,提高程序的灵活性和重用性。 1. 变量...
例如,如果我们要将PLC中的变量“Var1”赋值为10,脚本可以写成:“SetValue(Var1, 10)”。 5. **保存和编译**: 输入完成后,记得保存你的改动。在主菜单中选择“项目” -> “编译”来检查是否有语法错误或逻辑...
在这个教程中,我们将学习如何使用`yml`配置文件为静态变量赋值,特别是针对像数据查询引擎连接工具类这样的场景。 首先,我们需要在`yml`配置文件中定义所需的参数。以`clickhouse`为例,我们会在`application.yml...
### C++中函数内给类的指针变量赋值问题详解 #### 一、问题背景与分析 在C++编程中,指针的使用是非常常见的,尤其是在处理复杂数据结构或对象时。本文针对一个具体的场景——在函数内部给类的指针变量赋值时遇到...
Qt中执行sql语句,当需要变量存取从数据库中获取的值,首先取出一行数据,然后按列将数据分别赋给变量
在SQL编程中,变量的声明与赋值是构建复杂查询和流程控制的基础。本文将深入探讨SQL中的变量声明和赋值方法,旨在为初学者提供一个全面的理解框架,同时为有经验的开发者提供一个快速回顾的平台。 ### SQL变量声明 ...
在C语言中,赋值操作符`=`右侧的表达式计算完成后,结果会存储到左侧变量中。在Yacc文法中,这通常表现为一个规则,如`assign: ID '=' expr ';'`,其中`ID`是变量标识符,`expr`是赋值表达式。解析器会生成相应的C...
在本案例中,我们将探讨如何利用反射来实现变量的动态赋值,特别是在WPF(Windows Presentation Foundation)应用程序中的应用。 首先,理解C#中的变量。变量是存储数据的容器,它们有特定的数据类型,例如int、...
一、变量的定义 mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin…end 块中使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default...
超详细讲C++变量赋值
自动给变量赋值
初学者C语言
在 JavaScript 中,变量赋值看似简单,但实际上却存在一些潜在的陷阱,能够导致开发者的困惑和混乱。 JavaScript 是一门弱类型语言,声明变量不需要声明其类型,var x 就可以等于任何类型的值。这使得开发者容易陷入...
序列解包赋值是一种高效的方式,如`name, age = 'Lilly', 22`,它允许你将元组或列表中的元素分别赋值给一组变量,但要注意两边的元素数量必须相等,否则会导致语法错误。 最后,我们来谈谈变量使用中可能遇到的...
在编写存储过程时,我们经常需要对变量进行赋值,这时就涉及到`SET`和`SELECT`两种不同的赋值方式。尽管两者都可以用来对变量进行赋值,但它们之间存在一些关键区别。 首先,SQL Server官方推荐在对单个变量赋值时...