想象一下以下场景:
我正在使用SQL Server 2005.我有一个事务,在其他SQL语句中调用一个内部也有事务的存储过程。外部事务有时会失败,并在调用并成功提交存储过程后回滚。
我的问题是,存储过程的事务是否也会回滚?
答案 0 :(得分:38)
对于嵌套事务,提交不会将任何更改写入磁盘,但顶级事务除外。然而,无论事务的级别如何,回滚都会起作用,所以是的,它将回滚内部事务。
答案 1 :(得分:8)
绝对是的,顶级事务将拥有所有数据更改,直到提交或回滚为止。
但是,我鼓励您仔细考虑交易模型。您的系统中存在的此类方案越多,您对锁定问题的暴露程度就越高。此过程的计算费用也增加了。
值得注意的是,在合理化SQL时,我发现事务已经在不需要的地方实现了。我鼓励您(以及任何处理交易的人)仔细考虑您在每种情况下使用它们的原因以及未实施交易会发生什么。只是我的2c价值!
答案 2 :(得分:2)
是的,存储过程将被回滚。
以下是代码的整体流程:
BEGIN TRY
BEGIN TRANSACTION
EXEC SotredProcedureName
--Do some other activity
COMMIT TRANSACTION
END TRY
BEGIN CATCH
--IF an error occurs then rollback the current transaction, which includes the stored procedure code.
ROLLBACK TRANSACTION
END CATCH
干杯,约翰
答案 3 :(得分:1)
我尝试过使用begin tran并在存储过程中提交usp_test 使用下面的其他查询执行这些sp
update x set name='xxx'
select * from x---contains 'xxx'
begin tran
update x set name='yyy'
select * from x---contains 'yyy'
exec usp_test
select * from x---contains 'zzz' inside the sp
rollback tran
虽然在x表中执行上述查询名称必须是'xxx',但它不是'zzz',因为第一个begin tran回滚甚至sp tran提交。
因此,首先开始转换数据。
答案 4 :(得分:1)