數據庫事務及併發控制

1、引言php


一項事務(Database Transaction) 相比於數據庫,是指做爲數據庫系統中單個邏輯工做單元執行的一系列操做。事務之間相互獨立。事務在數據庫系統中主要用於:數據庫

1.提供可靠的邏輯工做單元保證數據庫的可恢復性(原子性),及數據庫的一致性。併發

2.保證併發程序間訪問數據庫具備隔離性。atom

由定義:一項數據庫事務必須具備:原子性(atomic),一致性(consistent),隔離型(isolated)及持久性(durable)。DBA常常將其簡稱爲ACID.spa

原子性保證數據庫或其餘數據存儲事務執行具備「all-or-nothing」性質即要麼完整的執行要麼不執行。隔離性保證不一樣事務間的執行互不相干。一致性保證結果符合數據庫存儲約束條件:Unique,reference(外鍵),primary key(主鍵)。持久性保證數據存儲的持久性。設計

2、數據庫約束條件代理


1.主鍵(primary key):標識數據元組的鍵,必須知足值不爲null,一張表中有且只有一個主鍵。排序

2.特殊鍵(unique key):指對數據庫元組中0~n(n<元組屬性個數)個屬性設置後保證該屬性值在數據庫表中惟一。在數據庫索引中默認爲惟一索引(unique index)。值能夠爲null索引

3.外鍵(reference key):用於標識被引用表(父表)中的惟一元組。值爲空或者爲被引用表(父表)的候選鍵(多爲主鍵).事務

plus:特殊鍵集合是數據元組的候選鍵,從候選鍵中挑選其一做爲數據元組主鍵。來自不一樣表之間的元組用外鍵進行索引。

鍵名 釋義
Simple(簡單鍵) 由元組中一個屬性組成的鍵。例:(simple key)
Concatenated(串聯鍵) 由元組中至少兩個屬性(Simple鍵)串連而成的單個鍵。例:(simple key_simple key)
Compound(混合鍵) 由元組中至少兩個屬性(Simple鍵)混合成的鍵。例:(simple key,simple key)
Composite(組合鍵) 由元組中至少1個混合鍵並至少一個Simple鍵組合而成的鍵。例:((simple key,simple key),simple key)
Natural(天然鍵) 不利用本數據庫中元組屬性來生成鍵,直接由外部來定義生成。
Surrogate(代理鍵) 由數據庫系統生成的鍵或當生成時取決部分候選鍵的生成。多爲數字ID,主要用於提升運行效率。
Candidate(候選鍵) 候選鍵
Primary(主鍵) 在系統實現中多用該鍵來查詢數據表及不一樣表之間進行鏈接
Alternate(可選鍵) 除主鍵外能夠用來標識元組的鍵。爲單張表中除主鍵外可利用來查詢元組的鍵。
Foreign(外鍵) 本張表中引用的同一數據庫裏的另外一張表裏的特殊鍵(它們的值相同)。

3、事務型數據庫

事務型數據庫指數據庫管理系統,當在數據庫中寫入事務在執行未完成時支持回滾。現今的大多數關係型數據庫管理系統都支持事務。

  在數據庫系統中,一項事務能夠包含多條數據操做(讀,寫)。使用數據庫系統的用戶以保證數據的一致性和完整性做爲數據庫的衡量指標。數據庫事務執行(SQL)的通用範式爲:

1.執行事務(Begin the transaction)。

2.執行屬於事務的一系列數據操做(讀寫)。

3.若是事務執行過程未遇到錯誤則提交併正常終止事務。

4.若是遇到錯誤則回滾事務並終止事務。

實現上,多用戶的數據庫存儲和處理事務,常常經過爲每項事務分配一個ID.

其餘實現方式:

嵌套事務:在一個已有事務範圍內嵌套的事務。能夠有不一樣的實現方式,但他們有共同點即在最外層事務未結束以前不相關事務間的隔離性,這意味着嵌套事務不必定是必需要持久化更新數據到數據庫中。

4、併發控制

廣義的併發控制用於提供規則(rules),設計理論和方法來保證不一樣組建交互時併發操做的數據一致性(consistency)和正確性(correctness),乃至保證整個系統的一致性和正確性。在系統中引入併發控制會下降整個系統的運行效率,因此設計併發控制時在保證操做的一致性和正確性的同時,儘可能提升程序的運行效率。

併發控制在數據庫管理系統中保證事務的運行不會破壞數據的完整性約束。理論;序列化理論(serializability theory)及原子性事務(atomic transction 1993)。在數據庫實現中多運用序列化理論。爲了保證數據的正確性,DBMS保證只有序列化的事務纔會被執行。

1.爲何須要併發控制?

若是事務的執行是序列化的即順序的執行沒有時間上的疊加,那麼就不存在事務的併發。然而,爲了提升系統的運行效率,容許對數據庫交叉讀寫的併發操做,這致使讀寫操做的不可控同時一些未指望的結果的發生。好比:

i.丟失更新問題:時間序列上,第二個寫數據事務在第一個寫數據事務後執行。例:假如3個事務(t1,t2,t3)併發,兩個寫,一個讀。順序執行狀況下爲(t1寫,t2讀,t3寫),因爲併發狀況沒法保證事務在時間上的順序,出現了(t1寫,t3寫,t2讀)的狀況。多出如今數據庫數據更新的狀況下。

ii,讀髒數據問題:時間序列上,第二個讀操做在第一個刪除操做前執行。例:加入2個事務(t1,t2)併發,一個刪除,一個讀。順序執行狀況下爲(t1刪除,t2讀),併發狀況下:(t2讀,t1刪除)

iii,不正確的總結問題:兩個事務併發,一個事務用於總結數據庫有多少相同屬性值的元組,另外一個事務寫數據,寫的操做能夠在總結完前寫入,也可能在總結後寫入。這致使總結的數據是一個隨機值。

2.併發控制機制

樂觀鎖:在事務執行完後再對事務併發的隔離性和完整性進行檢驗,若是不知足事務的約束條件則,則挑選出以前已被遺棄某些事務從新再執行。應用場合:重複執行的事務量比較小。

悲觀鎖:若是一項事務的執行不知足併發控制的條件(隔離型和完整性約束),則對其進行加鎖直到該事務知足併發控制條件時才釋放鎖。

半樂觀鎖:對併發控制的一部分條件加悲觀鎖,另外一部分條件加樂觀鎖。

當兩個事務之間相互加鎖(相互之間,一個對另外一個加鎖)容易引起死鎖。死鎖問題的解決多爲開一個駐留事務解除死鎖,並迅速從新開啓,從新執行。

2.1 鎖(如:兩階段鎖-Two Phase Locking 2PL)對控制寫的事務的對數據進行加鎖;對一個事務加鎖的另外一事務也可能被加鎖。

2.2序列化圖檢查。檢測事務調用圖是否構成環,若構成經過放棄某些事務來解除死循環形成的死鎖。

2.3 根據時間戳進行排序。給事務分配時間戳,並對數據併發的事務按時間戳來進行排序分配資源。

2.5 根據提交順序。

2.6 多版本併發控制。

 

5、參考:


http://en.wikipedia.org/w/index.php?title=Database_transaction&oldid=521605403

http://en.wikipedia.org/wiki/Unique_key

http://en.wikipedia.org/wiki/Foreign_key

http://en.wikipedia.org/wiki/Nested_transaction

http://en.wikipedia.org/wiki/Concurrency_control

相關文章
相關標籤/搜索