是否可以在多个程序之间共享SQL Server事务?

时间:2018-08-10 17:49:21

标签: .net sql-server distributed-transactions

在某些情况下,我需要以下顺序来使用我们的内部工具,这些内部工具必须一起工作以准备用于测试目的的数据库。

  • program1开始,开始数据库事务并退出
  • program2开始并加入同一数据库事务,执行一堆语句然后退出
  • program3也会启动并加入同一数据库事务,执行一堆语句然后退出
  • program4开始并决定是否/何时回滚交易

程序是.Net命令行应用程序。

我研究了MSDTC / TransctionScope,但是我找不到任何程序启动交易然后退出而又保持交易开放以供其他程序加入的场景。

这可行吗?


编辑(可能的解决方案):

我测试了sp_getbindtoken / sp_bindsession,它可以正常工作:

program1可以做到这一点(在.Net代码中)

begin transaction
DECLARE @bind_token varchar(255);  
EXECUTE sp_getbindtoken @bind_token OUTPUT; 
print @bind_token

并将bind_token返回/写入一个文件,其他程序可以在其中获取令牌并加入该事务:

sp_bindsession ':7:FliJ.4AShUOIOjb<6^]5---0aE=--'
//Do stuff
rollback transaction

但是program1在整个过程中必须保持活动状态,以使会话保持活动状态,同时其他程序加入/离开会话。

此api的文档说明:

  

此功能处于维护模式,在将来的Microsoft SQL Server版本中可能会删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

2 个答案:

答案 0 :(得分:1)

SQL事务被锁定为其连接。无法通过多个应用程序共享连接。

但是,实现目标的一种方法是将所有应用程序的查询代理到一个实际包含连接及其事务的单个应用程序。

答案 1 :(得分:0)

事务特定于已连接源的每个会话。每次不同的代码段独立运行时,它将启动一个新事务。要使软件使用相同的连接,必须全部从一个来源一次性运行。例如,一个应用程序启动与数据库源的开放连接,然后运行所需的所有代码,然后终止代码。

不幸的是,一个会话无法通过同一事务加入另一个会话。