在SQL Server資料庫中加鎖時,除了可以對不同的資源加鎖,還可以使用不同程度的加鎖方式,即鎖有多種模式,SQL Server中鎖模式包括:
1.共用鎖定 SQL Server中,共用鎖定用於所有的唯讀資料操作。共用鎖定是非獨佔的,允許多個並發事務讀取其鎖定資源。預設情況下,資料被讀取後,SQL Server立即釋放共用鎖定。例如,執行查詢“SELECT * FROM AUTHORS”時,首先鎖定第一頁,讀取之後,釋放對第一頁的鎖定,然後鎖定第二頁。這樣,就允許在讀操作過程中,修改未被鎖定的第一頁。但是,交易隔離等級串連選項設定和SELECT語句中的鎖定設定都可以改變SQL Server的這種預設設定。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整個查詢過程中,保持對錶的鎖定,直到查詢完成才釋放鎖定。
2.更新鎖定 更新鎖定在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共用鎖定造成的死結現象。因為使用共用鎖定時,修改資料的操作分為兩步,首先獲得一個共用鎖定,讀取資料,然後將共用鎖定升級為排它鎖,然後再執行修改操作。這樣如果同時有兩個或多個事務同時對一個事務申請了共用鎖定,在修改資料的時候,這些事務都要將共用鎖定升級為排它鎖。這時,這些事務都不會釋放共用鎖定而是一直等待對方釋放,這樣就造成了死結。如果一個資料在修改前直接申請更新鎖定,在資料修改的時候再升級為排它鎖,就可以避免死結。
3.排它鎖 排它鎖是為修改資料而保留的。它所鎖定資源,其他事務不能讀取也不能修改。
4.結構鎖 執行表的資料定義語言 (Data Definition Language) (DDL) 操作(例如添加列或除去表)時使用架構修改 (Sch-M) 鎖。當編譯查詢時,使用架構穩定性 (Sch-S) 鎖。架構穩定性 (Sch-S) 鎖不阻塞任何事務鎖,包括排它鎖。因此在編譯查詢時,其它事務(包括在表上有排它鎖的事務)都能繼續運行。但不能在表上執行 DDL 操作。
5.意圖鎖定 意圖鎖定說明SQL Server有在資源的低層獲得共用鎖定或排它鎖的意向。例如,表級的共用意圖鎖定說明事務意圖將排它鎖釋放到表中的頁或者行。意圖鎖定又可以分為共用意圖鎖定、獨佔意圖鎖定和共用式獨佔意圖鎖定。共用意圖鎖定說明事務意圖在共用意圖鎖定所鎖定的低層資源上放置共用鎖定來讀取資料。獨佔意圖鎖定說明事務意圖在共用意圖鎖定所鎖定的低層資源上放置排它鎖來修改資料。共用式排它鎖說明事務允許其他事務使用共用鎖定來讀取頂層資源,並意圖在該資源低層上放置排它鎖。
6.大容量更新鎖定 當將資料大量複製到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 設定了 table lock on bulk 表選項時,將使用大容量更新 鎖。大容量更新鎖定允許進程將資料並發地大量複製到同一表,同時防止其它不進行大量複製資料的進程訪問該表。
sqlserver使用select加鎖:
功能說明
NOLOCK(不加鎖)
此選項被選中時,SQL Server 在讀取或修改資料時不加任何鎖。 在這種情況下,使用者有可能讀取到未完成事務(Uncommited Transaction)或復原(Roll Back)中的資料, 即所謂的“髒資料”。
HOLDLOCK(保持鎖)
此選項被選中時,SQL Server 會將此共用鎖定保持至整個事務結束,而不會在途中釋放。
UPDLOCK(修改鎖)
此選項被選中時,SQL Server 在讀取資料時使用修改鎖來代替共用鎖定,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個進程能同時讀取資料但只有該進程能修改資料。
TABLOCK(表鎖)
此選項被選中時,SQL Server 將在整個表上置共用鎖定直至該命令結束。 這個選項保證其他進程只能讀取而不能修改資料。
PAGLOCK(頁鎖)
此選項為預設選項, 當被選中時,SQL Server 使用共用頁鎖。
TABLOCKX(排它表鎖)
此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的資料。
功能說明
HOLDLOCK
將共用鎖定保留到事務完成,而不是在相應的表、行或資料頁不再需要時就立即釋放鎖。HOLDLOCK 等同於 SERIALIZABLE。
NOLOCK
不要發出共用鎖定,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間復原的頁面。有可能發生髒讀。僅應用於 SELECT 語句。
PAGLOCK
在通常使用單個表鎖的地方採用頁鎖。 READCOMMITTED 用與運行在提交讀隔離等級的事務相同的鎖語義執行掃描。預設情況下,SQL Server 2000 在此隔離等級上操作。
READPAST
跳過鎖定行。此選項導致事務跳過由其它事務鎖定的行(這些行平常會顯示在結果集內),而不是阻塞該事務,使其等待其它事務釋放在這些行上的鎖。
READPAST
鎖提示僅適用於運行在提交讀隔離等級的事務,並且只在行級鎖之後讀取。僅適用於 SELECT 語句。
READUNCOMMITTED
等同於 NOLOCK。 REPEATABLEREAD 用與運行在可重複讀隔離等級的事務相同的鎖語義執行掃描。
ROWLOCK
使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。 SERIALIZABLE 用與運行在可串列讀隔離等級的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。
TABLOCK
使用表鎖代替粒度更細的行級鎖或頁級鎖。在語句結束前,SQL Server 一直持有該鎖。但是,如果同時指定 HOLDLOCK,那麼在事務結束之前,鎖將被一直持有。
TABLOCKX
使用表的排它鎖。該鎖可以防止其它事務讀取或更新表,並在語句或事務結束前一直持有。
UPDLOCK
讀取表時使用更新鎖定,而不使用共用鎖定,並將鎖一直保留到語句或事務的結束。UPDLOCK 的優點是允許您讀取資料(不阻塞其它事務)並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。
XLOCK
使用排它鎖並一直保持到由語句處理的所有資料上的事務結束時。可以使用 PAGLOCK 或 TABLOCK 指定該鎖,這種情況下排它鎖適用於適當層級的粒度。 至於鎖定多少條記錄的問題, sql預設的鎖定行為本來就是行級鎖定的, 所以你用TOP 1指定只鎖定一條記錄就好了/
SELECT TOP 1 * FROM tb WITH(UPDLOCK, READPAST)