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)
但是当我在链接服务器表上运行此代码时,该表仍然可以从链接服务器内访问!为什么?我如何像我的例子一样在这个远程表上设置锁?
尝试跨多个服务器执行事务时,需要使用BEGIN DISTRIBUTED TRANSACTION
代替BEGIN TRANSACTION
。
如果我的理解是正确的,BEGIN TRANSACTION
默认创建一个本地事务。在某些情况下(例如,如果您在UPDATE
远程服务器上的表上执行操作),这将升级为分布式事务。如果您remote proc trans
为远程服务器打开了电源,那么运行远程存储过程之类的事情也应该自动升级为分布式事务。
否则,远程操作将遵循正常的事务规则作为远程服务器上的独立操作——在这种情况下,远程服务器SELECT
上将在其自己的单语句“本地”事务中,并且当SELECT
完全的。
您可能还需要使用SET XACT_ABORT ON
.
而且,(正如您在评论中指出的那样),您需要确保MS 分布式事务协调器服务处于.