我有类似下面的代码,现在我只需要提交内部事务,外部事务可以提交或回滚。如何处理?
BEGIN TRY
BEGIN TRANSACTION
INSERT TABLE T1 (1,2,3)
----
----
----
IF t1 > 10
BEGIN
BEGIN TRANSACTION
INSERT INTO ERROR_LOG (XX)
COMMIT
return 1
END
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
仅当t1> 10然后事务应提交错误日志并终止程序
答案 0 :(得分:2)
如果您希望将某些结果存储到ERROR_LOG并回滚其他更改,则内部事务不会这样做,因为在SQL Server中,外部事务将回滚所有内容。
这里有一些测试& Paul Randal的解释:http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/
解决此限制的一种方法是使用表变量进行日志记录,因为它不会回滚,然后在执行回滚后将结果插入日志中。