例:張三給李四轉賬10元李四賬戶增加10元,張三賬戶減少十元,要麼都執行成功,要麼都失敗(回滾)
例:張三給李四轉20元,王五給孫六轉10元。兩個事務互不干擾,不能張三的錢轉給孫六。
例:張三轉給李四40元張三和李四的總賬戶餘額不變。
原子性和隔離性保證一致性
這四種隔離級別是sql的標準定義。mysql預設級別是repeatable read,且不會出現幻讀。在介紹mvcc前,先介紹一下兩個概念 版本鏈和readview
對於使用innodb儲存引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列( row_id並不是必要的,我們建立的表中有主鍵或者非null唯一鍵時都不會包含row_id列):
trx_id:每次對某條記錄進行改動時,都會把對應的事務id賦值給trx_id隱藏列。對於使用read uncommitted隔離級別的事務來說,直接讀取記錄的最新版本就好了,對於使用serializable隔離級別的事務來說,使用加鎖的方式來訪問記錄。對於使用read committed和repeatable read隔離級別的事務來說,就需要用到我們上邊所說的版本鏈了,核心問題就是:需要判斷一下版本鏈中的哪個版本是當前事務可見的。roll_pointer:每次對某條記錄進行改動時,這個隱藏列會存乙個指標,可以通過這個指標找到該記錄修改前的資訊
readview中主要包含4個比較重要的內容:
m_ids:表示在生成readview時當前系統中活躍的讀寫事務的事務id列表。注意max_trx_id並不是m_ids中的最大值,事務id是遞增分配的。比方說現在有id為1, 2, 3這三個事務,之min_trx_id:表示在生成readview時當前系統中活躍的讀寫事務中最小的事務id,也就是m_ids中的最小值。
creator_trx_id:表示生成該readview的事務的事務id。
後id為3的事務提交了。那麼乙個新的讀事務在生成readview時, m_ids就包括1和2, min_trx_id的值就是1,
max_trx_id的值就是4。
有了這個readview,這樣在訪問某條記錄時,只需要按照下邊的步驟判斷記錄的某個版本是否可見:
1)如果被訪問版本的trx_id屬性值與readview中的creator_trx_id值相同,意味著當前事務在訪問它自己修改過的記錄,所以該版本可以被當前事務訪問。mvcc(multi-version concurrency control ,多版本併發控制)指的就是在使用read committd、repeatable read這兩種隔離級別的事務在執行普通的seelct操作時訪問記錄的版本鏈的過程。可以使不同事務的讀-寫、寫-讀操作併發執行,從而提公升系統效能。read committd、repeatable read這兩個隔離級別的乙個很大不同就是:生成readview的時機不同,read committd在每一次進行普通select操作前都會生成乙個readview,而repeatable read只在第一次進行普通select操作前生成乙個readview,之後的查詢操作都重複使用這個readview就好了。2)如果被訪問版本的trx_id屬性值小於readview中的min_trx_id值,表明生成該版本的事務在當前事務生成readview前已經提交,所以該版本可以被當前事務訪問。
3)如果被訪問版本的trx_id屬性值大於readview中的max_trx_id值,表明生成該版本的事務在當前事務生成readview後才開啟,所以該版本不可以被當前事務訪問。
4)如果被訪問版本的trx_id屬性值在readview的min_trx_id和max_trx_id之間,那就需要判斷一下trx_id屬性值是不是在m_ids列表中,如果在,說明建立readview時生成該版本的事務還是活躍的,該版本不可以被訪問;如果不在,說明建立readview時生成該版本的事務已經被提交,該版本可以被訪問
資料庫事務以及JDBC事務隔離級別
是併發控制的單元,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位.原子性 atomic 對資料的修改要麼全部執行,要麼全部不執行。一致性 consistent 在事務執行前後,資料狀態保持一致性。隔離性 isolated 乙個事務的處理不能影響另乙個事務的處理。持...
資料庫事務特性以及隔離級別
資料庫如果支援事務的操作,那麼就具備以下四個特性 原子性 atomicity 事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。一致性 consistency 事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。隔離性 isolation ...
資料庫的事務 事務併發以及隔離級別
事務的定義 事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。事務通常是以begin transaction開始,以commi...