close
文章出處

在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
arrow
arrow
    全站熱搜

    AutoPoster 發表在 痞客邦 留言(0) 人氣()