資料庫的鎖問題

2021-08-23 14:52:05 字數 2610 閱讀 1552

事務的併發控制協議

oracle採用類似於多版本兩段鎖的協議(multiversion two-phase lock protocol)

多版本兩段鎖協議對唯讀事務和更新書屋加以區別,如果是唯讀事務則採用多版本控制協議,如果是更新事務則採用強兩段鎖協議。

鎖分共享鎖(shared)和排他鎖(exclusive)

資料庫對每個資料項q,建立多個版本,每個版本有有三個資料字段:

content:qk的值

w-timestamp:建立qk版本的事務的時間戳值

如果事務ti要讀q的值:首先要獲得這個資料項上的共享鎖,其次要找出qk,它具有小於或者等於ts(ti)的最大寫時間戳,最後讀出其content欄位的值,釋放共享鎖

更新事務要寫q的值,首先要獲得該資料項上的排他鎖,然後為此資料項建立乙個新的版本,在新的版本上進行修改,新版本的時間戳最初設定為無窮大,則沒有事務可以讀取它,最後事務提交後,則將新版本的寫時間戳設定為更新事務的時間戳,並釋放排他鎖。

多粒度封鎖(granularity)

在事務的併發協議中,引入了鎖的概念,加鎖的粒度需要進行控制,我們可以對於各種各樣大小的資料粒度加鎖,小粒度資料項巢狀在大粒度資料項中。在我們對乙個節點加鎖的時候,同時也隱含的對這個節點的所有子節點加鎖。

在oracle中資料粒度分為表和資料記錄,在我們對這個表加鎖的同時,也隱含這我們對這個表的所有資料記錄加鎖

[color=blue]

意向鎖的引入:假設我們現在對乙個表的乙個資料記錄加了鎖,現在另外乙個事務則要對整個表加鎖,則首先要判斷表節點的鎖節點型別是否相容,同時還要判斷這個表節點的所有後裔節點所加的鎖是否和其相容,這樣效率非常低。所以我們引入了意向鎖(intention lock mode)來解決這個問題,在乙個節點顯式加鎖之前,該節點的全部祖先勻加上了意向鎖。

事務判定能否成功給乙個節點加鎖時候,不必去搜尋從根到這個節點和這個節點所有後裔節點的路徑,之用搜尋從根節點到這個節點的路徑是否相容就可以了

基本的鎖型別有s,x與意向鎖型別(ix,is),這兩種鎖互相組合還可以組合出來四種

s+ix:在這個節點上顯式加s鎖,這個節點的後裔節點上隱式加s鎖,在這個節點上加ix鎖,在這個節點的後裔節點上加x鎖

s+is:在這個節點上加s鎖,這個節點的後裔節點上隱式的加s鎖,在這個節點上加is鎖,在這個節點的後裔節點上加s鎖,所以說這種型別並不能給我們帶來什麼方便,起到的所用完全和s鎖一樣,所以不考慮

x+is:

x+ix:[/color]

意向鎖在oracle中的表示就是rx(row exclusived),rs(row shared),srx(shared+row exclusived)

這樣在oracle中使用的型別就有五種:s,x,rx,rs

如果乙個事務要對乙個資料物件加鎖,則必須對它的上層節點加意向鎖,比如說要對錶的一條記錄加s鎖,則必須對這個表加rs鎖

oracle鎖的分類

1. dml鎖:用於保護資料的完整性

dml鎖,又稱資料鎖,從封鎖的粒度看,oracle dml鎖又兩個層次,行級鎖和表級鎖

(1) 行級鎖(tx)

當乙個事務進行dml操作或者使用select…for update語句進行查詢的時候,會對所操作的行產生乙個tx鎖,直到這個事務被commit/rollback

tx鎖是行級別的,乙個tx鎖可以鎖定多行

(2) 表級鎖(tm)

表級鎖分為(2,row share)(3,row exclusive)(4,share)(5,share row exclusive)(6,exclusive)

2. ddl鎖:dictionary locks字典鎖,用於保護資料庫物件的結構(例如table,view,index的結構定義)

3. internal locks和latch(記憶體鎖)

4. distributed locks(分布式鎖)

5. pcm locks(並行快取記憶體管理鎖)

[color=blue]意向鎖

意向鎖表示 sql server 需要在層次結構中的某些底層資源上獲取共享 (s) 鎖或排他 (x) 鎖。例如,放置在表級的共享意向鎖表示事務打算在表中的頁或行上放置共享 (s) 鎖。在表級配置意向鎖可防止另乙個事務隨後在包含那一頁的表上獲取排他 (x) 鎖。意向鎖能夠提高效能,因為 sql server 僅在表級檢查意向鎖來確定事務是否能夠安全地獲取該錶上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務是否能夠鎖定整個表。

意向鎖包括意向共享 (is)、意向排他 (ix) 連同和意向排他共享 (six)。

鎖模式 描述

意向共享 (is) 通過在各資源上放置 s 鎖,表明事務的意向是讀取層次結構中的部分(而不是全部)底層資源。

意向排他 (ix) 通過在各資源上放置 x 鎖,表明事務的意向是修改層次結構中的部分(而不是全部)底層資源。ix 是 is 的超集。 www.bitscn.com

和意向排他共享 (six) 通過在各資源上放置 ix 鎖,表明事務的意向是讀取層次結構中的全部底層資源並修改部分(而不是全部)底層資源。允許頂層資源上的併發 is 鎖。例如,表的 six 鎖在表上放置乙個 six 鎖(允許併發 is 鎖),在當前所修改頁上放置 ix 鎖(在已修改行上放置 x 鎖)。雖然每個資源在一段時間內只能有乙個 six 鎖,以防止其他事務對資源進行更新,但是其他事務能夠通過獲取表級的 is 鎖來讀取層次結構中的底層資源。 [/color]

資料庫鎖問題

為了保證資料的一致性。mysql資料庫存在多種資料引擎,mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行級鎖定和頁級鎖定。1.表級鎖 表級鎖一次會將整個表鎖定,所可以很好的避免死鎖問題 1 鎖定粒度大,鎖衝突概率高 併發度低 2 好處是不會出現死鎖 開銷小 獲取鎖和釋放鎖的速度很快...

資料庫 涉及鎖的問題

加鎖 鎖是一種併發控制技術,鎖是用來在多個使用者同時訪問同乙個資料的時候保護資料的。一 有兩種基本的鎖型別 共享鎖 s 多個事務可封鎖乙個共享頁 任何事務都不能修改該頁 通常是該頁被讀取完畢,s鎖立即被釋放。在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是...

資料庫鎖表問題

當多使用者對資料庫進行併發操作時是容易導致資料不一致的問題。一般解決方法是,盡量從業務邏輯的角度來規避這種問題,避免使用資料庫的鎖表功能,容易引起一些問題,如死鎖,長時間的等待鎖的釋放等。如有些系統,從業務邏輯上分析是無需鎖表的,如客戶關係管理系統,自己的使用者只能自己檢視修改,其它人沒有許可權檢視...