事務的排程
乙個事務的執行就是一組指令的序列
一組事務的執行的順序我們可以成為排程
比如限制性事務1,再執行事務2,這種執行順序就是一種排程
放過來先執行事務2,再執行事務1,這又是一種排程
但是為了更好的事務併發,排程可以滲透到讓單個事務中個部分配合執行
比如先執行事務1中的a部分,再執行事務2中的c部分,然後再執行事務1中的b,事務2中的d
這也是排程,資料庫合理安排排程,保證併發事務之間的隔離性和一致性
最後要達到的目標是併發事務實現可序列化排程
也就是說,讓併發的事務從結果上看起來像序列一樣一致
衝突指令
如果屬於不同事務的兩個指令對統一資料項進行了操作
任意乙個為write指令,那麼這兩個指令就是衝突的
衝突指的是交換這兩個指令的順序就可能造成不一致性
衝突等價
非衝突指令交換順序不影響事務的一致性
在眾多指令中進行非衝突指令的順序調換前後的排程是衝突等價的
衝突可序列化
乙個排程s與序列排程衝突等價那就稱衝突s為衝突可序列化的
如何判斷乙個排程是否衝突可序列化
也就是保證乙個排程是否與序列排程衝突等價
用圖論的知識可以判斷
事務的隔離性實現原理
事務隔離性依靠資料庫的併發控制機制來實現
而併發控制機制主要考鎖和時間戳來實現
鎖共享鎖
是對資料項讀的一種鎖
多個事務可以同時持有乙個資料項的共享鎖
排它鎖是對資料項寫的一種鎖
只有任何鎖都沒有的資料項才能有排它鎖
時間戳共有三種時間戳
事務時間戳
通常是事務開始的時間
資料項讀戳
記錄最近讀資料項的事務的時間戳
資料寫戳
記錄最近寫資料項的事務的時間戳
作用處理訪問衝突的情況
比如多個事務讀的時候,按照時間戳的大小進行讀
當乙個事務訪問不了資料項的時候
中止這個事務並且更新事務的時間戳重新開始執行
事務的隔離性級別
來由來由如果研究要求排程的可序列化,那麼支援的併發量將會非常低
適當放寬可序列化的標準,採取不那麼一致性的排程能得到很好的併發量
不同級別一致性的程度劃分除了事務的隔離性級別
可序列化級別
通常保證可序列化排程
說通常是因為某些資料庫允許某些情況下非可序列化排程
可重複讀
只允許讀取已經提交了的資料
而且乙個事務兩次讀取中不允許其他事物更新該資料項
被其他事物更新了之後前後兩次讀取的資料項值不一樣
再簡單點說就是不允許乙個事務兩次讀過程中另乙個事務寫
因為寫是更新必須的,光讀不算更新
已提交讀
只允許讀取已經提交的
但不要求可重複讀
也就是不要求兩次讀之間不能被其他事務寫
但是可以讀
未提交讀
允許讀未提交的資料
用處如果有時候想提高系統的效能可以考慮研究下乙個業務邏輯
然後選擇更低階別的隔離性級別
判斷標準是這種理論上的不一致可能在現實中影響不大或者發生概率很低
舉例比如航班選擇系統中,如果乙個使用者選擇的行程中有多個航班轉機
系統允許個飛機,使用者都能選自己想要的座位,這是很人性化的
從價載入各飛機各個空餘座位資訊到使用者選好各個飛機的座位這是一整個事務
我們允許兩個使用者同併發執行這類事務,很可能乙個選好了之後被告知
剛剛選的已經沒坐了,這在我們看起來很好理解
但是這顯然不滿足已提交讀,因為乙個使用者還沒提交事務的時候
各個使用者可以隨便進來讀
如果我們要求嚴格已提交讀的話,那很可能有些有選擇困難症的使用者一直挑選
其他的使用者就根本沒法選座位
注意所有隔離性級別都不允許髒寫
也就是不允許乙個事務執行了寫之後還沒提交或者中止的時候
另乙個事務進行了寫
即使是未提交讀,你的確可以讀,但是不能亂寫
如果未提交的事務執行了寫,未提交讀就不能寫
但是未提交讀沒有寫,你還是可以讀的
多數資料庫系統的預設隔離性級別是已提交讀
MySQL事務 隔離性中的隔離級別
建表 create table student id int primary key,name varchar 100 engine innodb charset utf8 測試資料 insert into student values 1 張三 如果乙個事務讀到了另乙個未提交事務修改過的資料,那麼...
事務的隔離級別舉例 事務的隔離級別
乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...