在1年前,我寫了篇在SQL Server里為什么我們需要更新鎖。今天我想繼續這個討論,談下SQL Server里的意向鎖,還有為什么需要它們。
SQL Server里的鎖層級
當我討論SQL Server里的鎖升級時,我從SQL Server使用的鎖層級開始題,在你讀或修改你的數據的時候。
當你讀取一條記錄時,SQL Server默認請求一個共享鎖(S),當你修改一條記錄時,SQL Server請求一個排它鎖(X)。這2個鎖彼此不兼容,當你同時向讀寫一條記錄時,會發生阻塞。
另外對于行級別的鎖,在鎖層級里,SQL Server也會在更高一層請求所謂的意向鎖(Intent Locks):在頁和表層級。SQL Server基于請求的行級別鎖,請求下列的意向鎖:
- 意向共享鎖(Intent Shared Lock (IS)),當你在行層級有一個共享鎖(S)
- 意向更新鎖(Intent Update Lock (IU)),當你在行層級有一個更新鎖(U)
- 意向排它鎖(Intent Exclusive Lock (IX)),當你在行層級有一個排它鎖(X)
因此當讀或寫你記錄時,你總會獲得如上圖所示的鎖層級。當SQL Server為什么使用這些意向鎖呢?
SQL Server里的意向鎖
從技術上來說,SQL Server并不真的需要意向鎖。這和性能優化有關。我們來具體看下。有了意向鎖,SQL Server表明在鎖層級里更高層級上,你需要請求其他鎖。意向共享鎖(Intent Shared Lock)告訴SQL Server某個地方有共享鎖(S)。對于意向更新鎖(Intent Update Lock)或意向排它鎖(Intent Exclusive Lock)也是一樣,但這次SQL Server知道在某個地方有更新鎖(Update Lock)或排它鎖(Exclusive Lock)。這只是個標識,沒別的。
但這個標識怎么幫助SQL Server性能優化?假設你再表層級請求一個排它鎖(X)。在這個情況下,SQL Server需要知道在某個記錄上是否有不兼容的鎖(像共享鎖(S)或更新鎖(U))。沒有意向鎖,SQL Server需要檢查每條記錄來看是否有一個授予的不兼容鎖。
但在表層級有意向共享鎖(IS)的話,SQL Server馬上知道在某個地方有授予的共享鎖(S),因此在表層級不能請求排它鎖(X)。這個就是SQL Server里存在意向鎖的原因:在鎖層級里,如果某個地方有不兼容的鎖存在,可以讓SQL Server快速查到。很簡單,是不是?
小結
技術上,SQL Server不需要意向鎖,因為它只表示在鎖層級里,某個地方有一些其他特定類型的鎖。當基于如果你想在頁或表上請求特定的鎖,SQL Server可以更高效的檢查是否有不兼容的鎖存在,還是需要有意向鎖。
感謝關注!
原文鏈接:
https://www.sqlpassion.at/archive/2016/05/16/why-do-we-need-intent-locks-in-sql-server/
不含病毒。www.avast.com |
留言列表