隔離級別 | 臟讀 | 不可重復讀 | 幻象 | 說明 |
未提交讀(read uncommitted) | 是 | 是 | 是 | 如果其他事務更新,不管是否提交,立即執行 |
提交讀(read committed默認) | 否 | 是 | 是 | 讀取提交過的數據。如果其他事務更新沒提交,則等待 |
可重復讀(repeatable read) | 否 | 否 | 是 | 查詢期間,不允許其他事務update |
可串行讀(serializable) | 否 | 否 | 否 | 查詢期間,不允許其他事務insert或delete |
請求模式 | IS | S | U | IX | SIX | X |
意向共享(IS) | 是 | 是 | 是 | 是 | 是 | 否 |
共享(S) | 是 | 是 | 是 | 否 | 否 | 否 |
更新(U) | 是 | 是 | 否 | 否 | 否 | 否 |
意向排它(IX) | 是 | 否 | 否 | 是 | 否 | 否 |
與意向排它共享(SIX) | 是 | 否 | 否 | 否 | 否 | 否 |
排它(X) | 否 | 否 | 否 | 否 | 否 | 否 |
共享鎖:為了共享讀(select),如果存在事務(一個或多個)擁有對表中數據(關于鎖數據的多少,視鎖的粒度而定)的共享鎖,不允許對鎖定的數據進行更新(update)
排他鎖:只能有一個,其他的事務就不能對鎖定的數據獲取共享鎖和排他鎖(即排他鎖與共享鎖不能兼容,更多信息請查看鎖兼容性),在此特別強調一下 鎖定的數據。
類型1
① READUNCOMMITTED:不發出鎖
② READCOMMITTED:發出共享鎖,保持到讀取結束
③ REPEATABLEREAD:發出共享鎖,保持到事務結束
④ SERIALIZABLE:發出共享鎖,保持到事務結束
類型2
① NOLOCK:不發出鎖。等同于READUNCOMMITTED
② HOLDLOCK:發出共享鎖,保持到事務結束。等同于SERIALIZABLE
③ XLOCK:發出排他鎖,保持到事務結束。
④ UPDLOCK:發出更新鎖,保持到事務事務結束。(更新鎖:不阻塞別的事物,允許別的事物讀數據(即更新鎖可與共享鎖兼容),但他確保自上次讀取數據后數據沒有被更新)
⑤ READPAST:發出共享鎖,但跳過鎖定行,它不會被阻塞。適用條件:提交讀的隔離級別,行級鎖,select語句中。
類型3
① ROWLOCK:行級鎖
② PAGLOCK:頁級鎖
③ TABLOCK:表鎖
④ TABLOCKX:表排他鎖
在SELECT語句中使用XLOCK并不能阻止讀。這是因為SQL SERVER在讀提交隔離級別上有一種特殊的優化,即檢查行是否已被修改,如果未被修改則忽略XLOCK。因為在讀提交隔離級別上這確實是可以接受的。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。