我正在尝试进行事务处理,并且有以下代码:
BEGIN TRANSACTION
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
COMMIT
首先,我放置了第一个insert语句以尝试在表中插入无效类型的数据(从char到bool),并且抛出了运行时异常,并且第一个语句之后的其他语句也被忽略了。
但是,当我放置第一个insert语句尝试在ID列中插入数字并且由于IDENTITY_INSERT
将其设置为OFF而引发错误时,此后的其他语句(包括COMMIT)被执行并将更改保存到DB。
我的问题是,为什么第一个错误会阻止一切执行,而第二个却没有呢?我如何知道运行时错误是否会阻止其余代码的执行?我以为每个运行时异常都会停止执行...
编辑:
第一种情况(执行停止时):
`Msg 245, Level 16, State 1, Line 6
Conversion failed when converting the varchar value 'a' to data type bit.`
第二种情况(继续执行时):
Msg 544, Level 16, State 1, Line 6
Cannot insert explicit value for identity column in table 'crmMappingRule' when IDENTITY_INSERT is set to OFF.
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
系统在编译批处理时会生成一些错误。由于这些错误阻止了批处理的编译,因此将返回错误,并且不会进行进一步的操作。
系统执行编译的批处理时会生成其他错误。这些错误可能会终止单个语句的执行,但将允许执行继续执行下一条语句1。
在编译时或执行时可能会生成一些错误,因此不仅只有两个列表:“编译期间将发生的错误”和“编译期间将发生的错误”。例如,你的第一个错误就转换varchar
到bit
。在这种情况下,它显然是在编译时发生的,因此varchar
查询中的文字可能也是如此。但是,如果该varchar
值来自另一个表,则可能是执行时间错误。
1 一些错误将中止该批处理。没有清楚的记录在哪里,哪些取决于有效的XACT_ABORT设置。我想这还不如我所记得。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句