資料庫鎖機制(一) 概述

2022-02-17 03:11:12 字數 1072 閱讀 4027

注:內容為自己的推理認知+網路,如有錯誤和不合理之處,敬請指出。

在多執行緒環境中我用使用執行緒鎖處理併發問題,而在資料庫系統中,併發問題可以細化到事務級別,而dbms對此的處理方案就是使用鎖。

為了適應不同的需求,完善的dbms對於鎖的粒度劃分應該是細粒度的,比如行鎖、頁鎖、表鎖、資料庫鎖等。

被鎖定的資料物件的表現行為當然和未被鎖定的資料物件不同,有的鎖可以指示已鎖定資料對於其他事務只可讀、不可修改,有的鎖指示已鎖定資料資料對於其他事務既不可讀也不可寫。

如何使用鎖呢?dbms提供給了我們可以直接在sql語句上使用的關鍵字,例如mssql中的holdlock、tablockx等,關鍵字比較適合於有特殊需求的業務,因為我們不可能為大量的sql語句都標註關鍵字,所以dbms為我們提供了另外的方法——事務隔離級別,相信大家也經常聽到這個名詞,但是實際專案中用到的卻不多,因為業務系統中大部分都使用相同的隔離級別,我們只要在封裝好的資料庫訪問層中寫死或者配置在配置檔案中就可以了。

對於事務隔離級別,大部分資料庫都遵循統一的標準,ansi/iso sql92標準中定義了四種隔離級別:

1、序列化(serializable):最高隔離級別,又稱序列化,顧名思義,事務進入執行佇列,必須乙個個順序執行,不能併發執行。

2:可重複讀(repeatable read):不允許未提交讀(髒讀)和不可重複讀(同一事務中對於同一資料任何時候查詢到的結果是相同的)

3:已提交讀(read committed):不允許未提交讀(髒讀),但是允許不可重複讀

4:未提交讀(read uncommitted):允許髒讀,即當前事務可以獲取到其他事務未提交的更改。

各大dbms在實現上略有不同。

鎖的粒度/隔離級別和併發性/資料一致性有如下的關係:

原因簡單說一下,因為鎖互斥性,所以併發事務會被阻塞,具體細節大家應該都能理解。

隔離級別的作用域是session級別的,對應到程式中就是同乙個連線物件,大多數dbms的預設隔離級別是已提交讀(read committed),sql關鍵字的加鎖優先順序要高於事務隔離級別。

資料庫鎖機制

這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...

資料庫鎖機制

這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...

資料庫鎖機制

資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否則不行。共享鎖通常在執行完select語句之後被釋放,當然...