正如我发现的那样,您可以在事务中设置对所需表的锁定:
begin tran
select 1 from myTable
with (tablock /*or tablockx to block even reads from table*/, holdlock)
-- do your work
commit tran
但是当我在链接服务器表上运行此代码时,仍然可以从链接服务器中访问该表!为什么?我如何像我的示例一样在此远程表上设置锁?
正如我发现的那样,您可以在事务中设置对所需表的锁定:
begin tran
select 1 from myTable
with (tablock /*or tablockx to block even reads from table*/, holdlock)
-- do your work
commit tran
但是当我在链接服务器表上运行此代码时,仍然可以从链接服务器中访问该表!为什么?我如何像我的示例一样在此远程表上设置锁?
当尝试跨多个服务器执行事务时,您需要使用
BEGIN DISTRIBUTED TRANSACTION
而不是BEGIN TRANSACTION
.如果我的理解是正确的,
BEGIN TRANSACTION
默认创建一个本地事务。在某些情况下(例如,如果您在UPDATE
远程服务器上的表上执行操作)这将升级为分布式事务。如果你已经remote proc trans
为远程服务器开启,那么像运行远程存储过程这样的事情也应该自动升级到分布式事务。否则,远程操作将作为远程服务器上的独立操作遵循正常的事务规则 - 在这种情况下,
SELECT
将在远程服务器上处于其自己的单语句“本地”事务中,并且锁定将在SELECT
完全的。您可能还需要使用
SET XACT_ABORT ON
.而且,(正如您在评论中指出的那样),您需要确保MS Distributed Transaction Coordinator 服务已开启。