在我的情况下,我们的内部工具需要以下顺序,这些工具必须一起工作,以便为测试目的准备一个数据库。
program1
启动、开始数据库事务并退出program2
启动并连接相同的数据库事务,执行一堆语句和出口。program3
还启动和连接相同的数据库事务,执行一堆语句并退出。program4
启动并决定是否/何时回滚事务这些程序是.Net命令行应用程序.
我研究了MSDTC
/ TransctionScope
,但是我找不到程序启动事务,然后退出,同时让事务打开以供其他程序加入的任何场景。
这可行吗?
编辑(可能的解决方案):
我测试了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的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
发布于 2018-08-10 10:21:27
SQL事务被锁定到它们的连接上。一个连接不能通过多个应用程序共享。
然而,实现目标的一种方法是将所有应用程序的查询代理到一个应用程序,该应用程序实际上保存了连接,因此也包含了它的事务。
发布于 2018-08-10 10:16:44
事务特定于连接源的每个会话。每次独立于另一个代码运行不同的代码时,它将启动一个新事务。要让软件使用相同的连接,就必须在一次运行中从一个源运行。例如,一个应用程序启动到数据库源的打开连接,然后运行所需的所有代码,然后终止该代码。
不幸的是,一个会话不能用同一个事务连接另一个会话。
https://stackoverflow.com/questions/51791689
复制相似问题