链接服务器:如何在远程表上设置排他锁?

ABS*_*ABS 3 sql-server t-sql linked-server

正如我发现的那样,您可以在事务中对所需的表设置锁定:

begin tran
    select 1 from myTable
        with (tablock /*or tablockx to block even reads from table*/, holdlock) 
    -- do your work
commit tran
Run Code Online (Sandbox Code Playgroud)

但是当我在链接服务器表上运行此代码时,该表仍然可以从链接服务器内访问!为什么?我如何像我的例子一样在这个远程表上设置锁?

RDF*_*ozz 6

尝试跨多个服务器执行事务时,需要使用BEGIN DISTRIBUTED TRANSACTION代替BEGIN TRANSACTION

如果我的理解是正确的,BEGIN TRANSACTION默认创建一个本地事务。在某些情况下(例如,如果您在UPDATE远程服务器上的表上执行操作),这将升级为分布式事务。如果您remote proc trans为远程服务器打开了电源,那么运行远程存储过程之类的事情也应该自动升级为分布式事务。

否则,远程操作将遵循正常的事务规则作为远程服务器上的独立操作——在这种情况下,远程服务器SELECT上将在其自己的单语句“本地”事务中,并且当SELECT完全的。

您可能还需要使用SET XACT_ABORT ON.

而且,(正如您在评论中指出的那样),您需要确保MS 分布式事务协调器服务处于.