如果我有一个使用不同参数多次执行另一个存储过程的存储过程,是否可以让每个调用独立于其他调用进行提交?
换句话说,如果嵌套过程的前两次执行成功,但第三次执行失败,是否可以保留前两次执行的结果(而不是回滚)?
我在SQL Server 2000中定义了类似的存储过程:
CREATE PROCEDURE toplevel_proc ..
AS
BEGIN
...
while @row_count <= @max_rows
begin
select @parameter ... where rownum = @row_count
exec nested_proc @parameter
select @row_count = @row_count + 1
end
END
答案 0 :(得分:8)
首先,there is no such thing as a nested transaction in SQL Server
但是,您可以根据此示例使用SAVEPOINTs(此处很长时间,以便在此处重现)来自SO用户Remus Rusanu
编辑:AlexKuznetsov提到(他删除了他的答案),如果交易注定失败,这将无效。 SET XACT_ABORT ON或某些触发错误可能会发生这种情况。
答案 1 :(得分:4)
来自BOL:
没有a的ROLLBACK TRANSACTION savepoint_name或transaction_name 滚回到开头 交易。嵌套时 交易,同样的声明 将所有内部事务回滚到 最外面的BEGIN TRANSACTION 言。
我还从另一个帖子here找到了以下内容:
请注意SQL Server事务 并没有真正嵌套你的方式 可能会想。一旦明白了 交易开始,随后 BEGIN TRAN增加@@ TRANCOUNT 而COMMIT递减值。 整个最重要的交易是 当COMMIT导致a时提交 零@@ TRANCOUNT。但是ROLLBACK 没有保存点回滚所有 包括最外层的工作 交易。
如果您需要嵌套事务 行为,你需要使用SAVE TRANSACTION而不是BEGIN TRAN和 使用ROLLBACK TRAN [savepoint_name] 而不是ROLLBACK TRAN。
所以看起来可能。