Sql-Server

連結伺服器:如何在遠端表上設置排他鎖?

  • July 25, 2017

正如我發現的那樣,您可以在事務中對所需表設置鎖定:

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 服務處於打開狀態

引用自:https://dba.stackexchange.com/questions/181737