Sql-Server
連結伺服器:如何在遠端表上設置排他鎖?
正如我發現的那樣,您可以在事務中對所需表設置鎖定:
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 服務處於打開狀態。