【发布时间】:2009-02-09 11:54:36
【问题描述】:
想象以下场景:
我正在使用 SQL Server 2005。我有一个事务正在调用除其他 SQL 语句之外的一个存储过程,该存储过程内部也有一个事务。外层事务有时会失败,在存储过程调用提交成功后会回滚。
我的问题是,存储过程的事务也会回滚吗?
【问题讨论】:
想象以下场景:
我正在使用 SQL Server 2005。我有一个事务正在调用除其他 SQL 语句之外的一个存储过程,该存储过程内部也有一个事务。外层事务有时会失败,在存储过程调用提交成功后会回滚。
我的问题是,存储过程的事务也会回滚吗?
【问题讨论】:
对于嵌套事务,提交不会将任何更改写入磁盘,顶级事务除外。回滚,但是无论事务的级别如何,它都会起作用,所以是的,它会回滚内部事务。
【讨论】:
绝对是的,顶级事务将拥有所有数据更改,直到它被提交或回滚。
不过,我建议您仔细考虑事务模型。您的系统中存在的此类场景越多,您面临的锁定问题就越大。该过程的计算开销也增加了。
令人惊讶的是,在合理化 SQL 时,我发现事务已经在不需要的地方实现了。我鼓励您(以及任何处理交易的人)仔细考虑为什么您在每种情况下都使用它们,以及如果交易未实施会发生什么。只值我的 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
干杯,约翰
【讨论】:
我已经尝试使用 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 提交都会回滚。
所以,首先开始传输自己的数据变化。
【讨论】: