是的,你可以!为自己使用链接服务器并将“远程 proc 事务提升”设置为 false。这是一个例子:
EXEC master.dbo.sp_addlinkedserver @server = N'LOOPBACK', @srvproduct=N'Microsoft', @provider=N'SQLNCLI', @datasrc=N'MYMACHINE\INSTANCE', @catalog=N'DB_NAME_HERE'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'remote proc transaction promotion', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'rpc', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'rpc out', @optvalue=N'true'
--I think most below are defaults
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'sub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'connect timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'collation name', @optvalue=null
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'lazy schema validation', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'query timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'use remote collation', @optvalue=N'true'
CREATE PROCEDURE dbo.ap_deleteme_outsideTransaction AS
--codes is just some random table I have
exec ('insert into codes values (1, ''TEST'', ''TEST_ED'', ''DELTE_ME'', 0, ''1234'', ''myId'', getDate())') at LOOPBACK
GO
CREATE PROCEDURE dbo.ap_deleteme_test_transaction AS
begin transaction
insert into codes values (10, 'TEST', 'TEST_ED', 'DELTE_ME_1', 0, '1234', 'myId', getDate())
--exec ('generic query you may want to execute') at LOOPBACK
exec dbo.ap_deleteme_outsideTransaction
insert into codes values (20, 'TEST', 'TEST_ED', 'DELTE_ME_2', 0, '1234', 'myId', getDate())
--rolling back like this makes no sense, but here you should be able to see 3 records
--inserted and then two rolled back. The record inserted in the second proc call
--will still remain.
rollback transaction
GO
我不认为这是最优的,但是一旦你设置了这个链接,你应该能够将任何你不想参与交易的呼叫定向到这个链接,并且它不会参与。我的初始测试没有显示出显着的性能影响,但请注意,在循环中进行调用可能会被证明代价高昂。
-更新:性能测试显示它的命中时间为 1-2 毫秒,但这比“直接”调用慢了大约 60 倍。大约 500 次点击并不明显,但当您获得数千次点击时,您会开始看到秒数加起来 - 这并不是一种常见的做法。我们看到它远远超过了其他副作用,例如阻塞,这就是我们放置它的目的。