带事务的存储过程A在事务中调用另外一个带事务的存储过程B,在B中存在各种记录业务运行过程以及错误的语句(写日志表)。
但如果A回滚了,那么B的所有操作也回滚了,有没有什么办法让日志记录脱离事务的控制?
或者有其他什么巧妙的方法?

解决方案 »

  1.   


    创建事务保存点:SAVE TRANSACTION savepoint_name 
     
      

  2.   

    SQL Server 不像 oracle 一样支持 autonomous_transaction,但是有几种变通的方法:其一,将存储过程 b 做成 clr 存储过程,事务回滚时不会影响 clr 存储过程。其二,在 SQL Server 2008 中,可以通过使用 LOOPBACK 服务器链接,让嵌套事务拥有独立的事务作用域。
    具体方法:
    建立 LOOPBACK 服务器链接(EXEC sp_addlinkedserver @server = N'loopback',@srvproduct = N' ',@provider = N'SQLNCLI', @datasrc = @@SERVERNAME);
    设置服务器链接选项,阻止  SQL Server 由于远程过程调用而将本地事务提升为分布事务(EXEC sp_serveroption loopback,N'remote proc transaction promotion','FALSE');
    在嵌套事务中通过 LOOPBACK 服务器连接调用过程(EXEC loopback.dbname.dbo.proc)。
      

  3.   

    我用的是sqlserver 2005,每个存储过程都建立了事务保存点纠结中...
      

  4.   

    嵌套调用的 t-sql 存储过程都处于一个事务作用域中。看样子只能写 clr 存储过程。