日期:2014-05-17  浏览次数:20496 次

多个存储过程如何共用一个事务?不然的话,只能采用嵌套事务了。
有A、B、C三个存储过程,它们被其它多个存储过程所调用,也有可能只执行A、B、C三者本身。

那我想达到这么一个效果:

执行A、B、C存储过程时,首先判断事务是否已经开启,如果事务已经被开启的话,那说明有别的存储过程来调用了A、B、C, 就继续执行 Try Catch中保护的代码。  如果事务没有开启的话,就在A、B、C内部Try Catch代码之间开启一个新的事务。

如果每个存储过程都建立事务的话,那多个存储过程一起执行的时候,事务所开销的资源就非常大,会使系统变慢数据库执行时间变长。

如果多个存储过程共用一个事务的话,如何解决在第N个存储过程执行出错后,使整个事务完整的退回呢?
事务 数据库

------解决方案--------------------
引用:
执行A、B、C存储过程时,首先判断事务是否已经开启,如果事务已经被开启的话,那说明有别的存储过程来调用了A、B、C, 就继续执行 Try Catch中保护的代码。  如果事务没有开启的话,就在A、B、C内部Try Catch代码之间开启一个新的事务。


判断事务是否开启?
有这玩意?

引用:
如果每个存储过程都建立事务的话,那多个存储过程一起执行的时候,事务所开销的资源就非常大,会使系统变慢数据库执行时间变长。
如果多个存储过程共用一个事务的话,如何解决在第N个存储过程执行出错后,使整个事务完整的退回呢?


事务会有多大开销……?
你有数据支持……?

你的执行思路有问题吧?
下面这样执行并不觉得会有什么开销或者判断问题吖……
DECLARE @Error1 int,@Error2 int,@Error3 int,@Error4 int
BEGIN TRANSACTION

执行存储过程1
Set @Error1 = @@error 

执行存储过程2
Set @Error2 = @@error 

执行存储过程3
Set @Error3 = @@error 

IF @ERROR1>0 or @ERROR2>0 or @ERROR3>0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
COMMIT TRANSACTION

------解决方案--------------------
判断@@TransCount
------解决方案--------------------
存储过程中的  事务  以  最外面的存储过程中的事物为主

BEGIN TRANSACTION
  exec sp1
exec sp2

rollback 或者 commit; //以这句为主,并不以sp1,或者sp2中的为主
end