A 存储过程调用B 存储过程,在 A过程 中如何实现"事物处理"呢?
-----------------------------------------------------------------
在一个存储过程中 进行事物处理,我知道如何实现,但是,有时会遇到 一个存储过程调用另一个存储过程的情况.
因为这样结构化会好一些.如果将所有代码全写到一个过程中,不好维护呀.但是,A存储过程调用B存储过程,如何在A存储过程中进行"事物处理"呢?
也就是说,如果撤销事物,A过程中执行的代码可以撤销,但是B过程中已经执行的代码,不会被撤消呀!可是,我又想在"嵌套调用的存储过程"中 使用"事物处理",我的想法可以实现吗?
-----------------------------------------------------------------
在一个存储过程中 进行事物处理,我知道如何实现,但是,有时会遇到 一个存储过程调用另一个存储过程的情况.
因为这样结构化会好一些.如果将所有代码全写到一个过程中,不好维护呀.但是,A存储过程调用B存储过程,如何在A存储过程中进行"事物处理"呢?
也就是说,如果撤销事物,A过程中执行的代码可以撤销,但是B过程中已经执行的代码,不会被撤消呀!可是,我又想在"嵌套调用的存储过程"中 使用"事物处理",我的想法可以实现吗?
as
begin tran
exec pro2
if @@ERROR <> 0
rollback tran
else
commit tran Create procedure pro2
as
begin
print 1
End
我试了,pro2的执行,rollback后不会撤销呀?
if object_id('TA') is not null drop table TA
GO
create table TA (id varchar(8),name varchar(20) )
insert into TA
select '1','表1' union all
select '2','表2' union all
select '3','表3' gocreate procedure pro1
as
begin tran
update ta set name=name +'update' where id='1'
exec pro2rollback tran
go Create procedure pro2
as
begin
update ta set name=name +'update' where id='2'
End
go
--test
exec pro1 select * from ta 我试了一下,可以回滚的
ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。ROLLBACK 还释放由事务控制的资源。不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到最远的 BEGIN TRANSACTION 语句。在这两种情况下,ROLLBACK TRANSACTION 均将 @@TRANCOUNT 系统函数减为 0。ROLLBACK TRANSACTION savepoint_name 不减少 @@TRANCOUNT。