1. 程式人生 > >遊標、事務併發和鎖三者之間的那點事

遊標、事務併發和鎖三者之間的那點事

對資料庫學習的不斷深入,對遊標的認識也在逐漸加深,遊標與事務、鎖有著密不可分的關係。 無論是事務、鎖還是遊標相對於資料庫來說最主要目的是保證資料的完整性。對事務併發、鎖定的深入學習才能更加完善對遊標的理解。少說廢話,下面進入本篇文章的正題。

首先,我們講解遊標與事務併發的那點事

事務是為完成特定任務,將一條或多條的SQL語句組合在一起。有效的使用事務不但可以提高資料的安全性,而且還可以增強資料的處理效率。如果沒有鎖定且多個使用者同時訪一個數據庫,多個事務使用相同的資料時就會出現事務併發的問題。

我們一張圖講解事務併發的四個方面:

從上圖我們可以看出來,事務併發的四個方面,歸根結底都有相似的地方:多個事務修改同一行資料,發生錯誤。

對比著學習遊標的併發問題,遊標的併發與事務的併發基本相同:多個遊標修改同一行資料,發生錯誤。

同樣,我們還是一張圖分析遊標的四個併發選項:

其次,我們講解鎖和事務併發的那點事

所謂鎖即是保證資料安全、資料庫的完整性和一致性,例如:每家的門鎖,因此,鎖可以防止事務的併發問題。我們看一下鎖的型別:

為了防止資料的併發性,可以使用鎖的粒度即鎖的級別,鎖定不同型別的資源。

死鎖又是怎麼產生的呢?

書上的概念:當兩個或多個執行緒之間有迴圈相關性時,將會產生死鎖。其實簡單的說就是:當兩個或多個事務需要同時使用一組有衝突的鎖,而不能將事務繼續下去,就會出現死鎖。

例如:有兩個事務:事務1、事務2。事務1具有Supplier表的排它鎖,事務2具有Part表上的排它鎖。事務1需要Part表上的鎖,無法獲得。事務2需要Supplier表上的鎖,也無法獲得,這樣就會出現死鎖。只要一方首先釋放持有的鎖,就不會出現死鎖。

如圖:

最後,我們講解遊標和鎖的那點事

遊標適用於任何其他SELECT語句的相同事務鎖定規則。通過任何SELECT語句獲得的事物鎖由下述兩項控制:

  • 連線的事物隔離級別設定
  • FROM子句中指定的任何鎖提示

對於遊標和獨立的SELECT語句,這些鎖都會保持到當前事務結束。

注:SQL Server以顯性或隱性事務執行,則這些鎖將保持到事務提交或回滾

舉兩個例子,其所作的鎖定基本相同。如下:

/* Example 1 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ —設定隔離級別為可重複讀
GO
BEGIN TRANSACTION
GO
SELECT * FROM AdventureWorks2008R2.Sales.Store;
GO

/* Example 2 */
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ  —設定隔離級別為可重複讀


GO
BEGIN TRANSACTION
GO
DECLARE abc CURSOR STATIC FOR
SELECT * FROM AdventureWorks2008R2.Sales.Store;
GO
OPEN abc
GO

遊標、事務併發和鎖三者之間的關係,就分析這麼多,希望對大家有所幫助。同樣,希望大家對菜鳥提出寶貴的意見。