MySQL 事務學習

2021-10-16 23:50:31 字數 2100 閱讀 4752

髒讀髒寫 都是因為讀取了事務未提交時的事務回滾情況髒寫

事務a與事務b同時更新一條資料,由於其中乙個事務回滾 導致另外事務執行成功的資料不存在了。

髒讀事務a還沒提交事務時事務b拿到值做了大量的操作,事務a回滾後出現的資料異常問題。

不可重複讀 與可重複讀

事務a修改了值並且提交了事務 b讀取到 然後b在執行事務期間 c又修改了值並且提交了。這時b讀取到的值又變了。 這就時不可重複讀問題。 可重複讀就相反 並且讀取到的值是相同的。

幻讀其實就是在事務執行期間第二次查詢相比第一次查詢出現了之前沒出現過的資料。

set global transaction isolation level serializable; 全域性

set session transaction isolation level serializable; 會話

mysql預設都是 rr 可重複讀級別 並且通過mvcc機制也不會發生幻讀的情況。trx_id:每次乙個事務對某條聚簇索引記錄進行改動時,都會把該事務的事務id賦值給trx_id隱藏列。

roll_pointer:每次對某條聚簇索引記錄進行改動時,都會把舊的版本寫入到undo日誌中,然後這個隱藏列就相當於乙個指標,可以通過它來找到該記錄修改前的資訊。

實際上insert undo只在事務回滾時起作用,當事務提交後,該型別的undo日誌就沒用了,它占用的undo log segment也會被系統**(也就是該undo日誌占用的undo頁面鍊錶要麼被重用,要麼被釋放)。

版本鏈的頭節點就是當前記錄最新的值 ,另外,每個版本中還包含生成該版本時對應的事務id,這個資訊很重要每次執行一次事務會產生乙個readview檢視

乙個是m_ids,這個就是說此時有哪些事務在mysql裡執行還沒提交的;

乙個是min_trx_id,就是m_ids裡最小的值;

乙個是max_trx_id,這是說mysql下乙個要生成的事務id,就是最大事務id;並不一定是m_ids 最大的事務id

事務id是遞增分配的。比方說現在有id為1,2,3這三個事務,之後id為3的事務提交了。那麼乙個新的讀事務在生成readview時,m_ids就包 括1和2,min_trx_id的值就是1,max_trx_id的值就是4。

乙個是creator_trx_id,就是你這個事務的id。

簡單來說mysql在每次查詢的時候會判斷資料的trxid是否小於等於自己,如果小於等於自己就可以查詢出來。如果不等於 會基於這條資料去找undolog鏈條找指向的小於等於我當前事務id的這條資料的版本出來。

期間判斷如果資料的事務id直接大於我當前檢視最大事務id,會直接忽略。 事務id 只有在提交事務後才會到資料上面。

rr 機制也就是判斷m_ids中如果查詢出來的資料事務版本號存在這裡面說明 在開啟檢視的時候這些事務就存在了還沒提交,我不能查詢出來這也就解決了不可重複度問題,由於新插入進來的資料版本號必定大於我當前檢視最大id,也查詢不到,也就解決了幻讀問題。

rc 的機制是可以讀取別人已經提交的事務資料 就是根據 判斷事務id是否存在於m_ids中,存在就不查詢出來,不存在說明可以查詢出來

​ 所謂的mvcc(multi-version concurrency control ,多版本併發控制)指的就是在使用read committd、repeatable read這兩種隔離級別的事務在執行普通的seelct操作時訪問記錄的版本鏈的過程,這樣子可以使不同事務的讀-寫、寫-讀操作併發執行,從而提公升系統效能。

​ read committd、repeatableread這兩個隔離級別的乙個很大不同就是:生成readview的時機不同,read committd在每一次進行普通select操作前都會生成乙個readview,而repeatableread只在第一次進行普通select操作前生成乙個readview,之後的查詢操作都重複使用這個readview就好了。

mysql事務學習

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!在 mysql 命令列的預設設定下,事務都是自動提交的,即執行 sql 語句後就會馬上執行...

mysql事務學習

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!在 mysql 命令列的預設設定下,事務都是自動提交的,即執行 sql 語句後就會馬上執行...

MySQL事務學習

mysql事務學習 分布式事務 innodb儲存引擎支援xa事務,通過xa事務可以支援分布式事務的實現。分布式事務指的是允許多個獨立的事務資源 transac tional resources 參與乙個全域性的事務中。事務資源通常是關係型資料庫系統,也可以是其它型別的資源。全域性事務要求在其中所有參...