資料庫的並發能力大家應該有目共睹了,功臣當然是眾所周知的鎖了。
可以在 SELECT、INSERT、UPDATE 及 DELETE 語句中為單個表引用指定鎖提示。提示指定 Microsoft SQL Server 資料庫引擎執行個體用於表資料的鎖類型或資料列版本設定。當需要對對象所獲得鎖類型進行更精細控制時,可以使用表級鎖提示。這些鎖提示覆蓋會話的當前交易隔離等級。
粒度提示:PAGLOCK、NOLOCK、ROWLOCK、TABLOCK 或 TABLOCKX。
隔離等級提示:HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD 和 SERIALIZABLE。
當啟用了基於資料列版本設定的隔離等級時,資料庫引擎 將維護修改的每一行的版本。應用程式可以指定事務使用行版本查看事務或查詢開始時存在的資料,而不是使用鎖保護所有讀取。通過使用資料列版本設定,讀取操作阻止其他事務的可能性將大大降低。
UPDATE Production.Product
WITH (ROWLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductId=100 ;嘗試為你的更新加上rowlock。
不申請共用鎖定:
SELECT * FROM Production.Product WITH (NOLOCK),嘗試著給你的查詢都加上nolock。
設定隔離等級:
對資料庫的完整性和有效行要求不高的查詢:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 或者SET TRANSACTION ISOLATION LEVEL READ NOLOCK
使用 PAGLOCK 或 TABLOCK 表提示,使資料庫引擎使用頁、堆或索引鎖而不是行鎖。但是,使用此選項增加了使用者阻止其他使用者嘗試訪問相同資料的問題,對於並發使用者較多的系統,不應使用此選項。
對於讀取操作,使用不會產生共用鎖定的隔離等級。
當 READ_COMMITTED_SNAPSHOT 資料庫選項為 ON 時,使用 READ COMMITTED 隔離等級(產生共用鎖定)。
使用 SNAPSHOT 隔離等級(除非正在恢複資料庫,否則 SNAPSHOT 事務不會在讀取資料時請求鎖。讀取資料的 SNAPSHOT 事務不會阻止其他事務寫入資料。寫入資料的事務也不會阻止 SNAPSHOT 事務讀取資料。)。
使用 READ UNCOMMITTED 隔離等級。此隔離等級只能用於能對髒讀進行操作的系統。