Sqlserver事務鎖級別詳記

2022-03-26 05:27:33 字數 1346 閱讀 7761

在資料庫開發過程中,不得不考慮併發性的問題,因為很有可能當別人正在更新表中記錄時,你又從該表中讀資料,那你讀出來的資料有可能就不是你希望得到的資料。可以說有些資料同時只能有乙個事物去更新,否則最終顯示給使用者的資料不是資料庫中現存的資料。鎖表就限制不同的事物在同一時間內不允許同時操作一張表,例項很簡單,可以用select來鎖定整張表,那別人就不可能更新或是讀取表的記錄。

select * from dbo.employee with(holdlock); with關鍵字來設定鎖表的方式。下面是with括號內關鍵字的書名: 

nolock(不加鎖)

此選項被選中時,sql server 在讀取或修改資料時不加任何鎖。 在這種情況下,使用者有可能讀取到未完成事務(uncommited transaction)或回滾(roll back)中的資料, 即所謂的「髒資料」。

holdlock(保持鎖)

此選項被選中時,sql server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。

updlock(修改鎖)

此選項被選中時,sql server 在讀取資料時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個程序能同時讀取資料但只有該程序能修改資料。

tablock(表鎖)

此選項被選中時,sql server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他程序只能讀取而不能修改資料。

paglock(頁鎖)

此選項為預設選項, 當被選中時,sql server 使用共享頁鎖。

tablockx(排它表鎖)

此選項被選中時,sql server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他程序讀取或修改表中的資料。

holdlock 持有共享鎖,直到整個事務完成,應該在被鎖物件不需要時立即釋放,等於serializable事務隔離級別

nolock 語句執行時不發出共享鎖,允許髒讀 ,等於 read uncommitted事務隔離級別

paglock 在使用乙個表鎖的地方用多個頁鎖

readpast 讓sql server跳過任何鎖定行,執行事務,適用於read uncommitted事務隔離級別只跳過rid鎖,不跳過頁,區域和表鎖

rowlock 強制使用行鎖

tablockx 強制使用獨佔表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表

uplock 強制在讀表時使用更新而不用共享鎖 。

呵呵,上面的夠研究一會的了,我常用的就是holdlock和tablockx,holdlock是鎖定一張表,但是別的事物還是可以讀取的,但不能更新和插入。對於tabllockx,在事物未提交前,連讀取都是阻塞的,直到另一事物提交後才可以讀取,這樣就保證了資料的一致性。不過鎖表需要包含在事物內,否則鎖表是不起作用的。

SQLserver鎖和事務隔離級別

隔離級別 隔離級別 髒讀不可重複讀 幻象說明 未提交讀 read uncommitted 是是 是如果其他事務更新,不管是否提交,立即執行 提交讀 read committed預設 否是 是讀取提交過的資料。如果其他事務更新沒提交,則等待 可重複讀 repeatable read 否否 是查詢期間,...

SQLserver鎖和事務隔離級別的比較與使用

來自 物件 鎖 每條sql 語句 隔離 事務 鎖 併發問題 丟失更新 未確認的讀取 髒讀 不一致的分析 非重複讀 多次讀取相同的資料 行 不一致 其他使用者更改update 幻像讀 多次讀取有不存在和新增的資料 其他使用者插入insert 或刪除delete 隔離級別 隔離級別 髒讀 不可重複讀取 ...

SQLserver鎖和事務隔離級別的比較與使用

物件 鎖 每條sql 語句 隔離 事務鎖 併發問題 丟失更新 未確認的讀取 髒讀 不一致的分析 非重複讀 多次讀取相同的資料 行 不一致 其他使用者更改update 幻像讀 多次讀取有不存在和新增的資料 其他使用者插入insert 或刪除delete 隔離級別 隔離級別 髒讀 不可重複讀取 幻像 說...