mysql5.7 關於mvcc的官方文件14.3 innodb multi-versioningdev.mysql.com
自己翻譯部分需要的資訊:
innodb是乙個多版本儲存引擎: 它儲存了修改記錄的歷史版本資訊,以便支援事務的併發和回滾功能。這些資訊儲存在表空間的回滾字段中。innodb使用回滾字段中的資訊實現事務回滾的取消操作。同時在一致性讀中,innodb使用這些資訊構建了歷史版本的記錄。
innodb在內部給每一條記錄新增了三列。乙個6位元組的事務id(db_trx_id)表示了上次插入或者更新該條記錄的事務識別號。此外,刪除操作視為更新操作,用特殊的1位標誌符來區分。每條記錄還包含乙個7位元組的回滾指標(db_roll_ptr)。這個回滾指標指向 回滾字段中的一條取消日誌記錄。如果一條記錄遭到了更新,那麼取消日誌記錄中會儲存恢復這條記錄的所有必要資訊(不儲存全部資訊,個人理解)。乙個6位元組的記錄id(db_row_id),隨著新紀錄的新增而單調增加。(記錄id後續不翻譯)
回滾字段中的取消日誌 是由 插入取消日誌 和 更新取消日誌組成的。插入取消日誌僅在事務回滾的時候有用。當事務提交的時候,插入取消日誌就被銷毀。更新取消日誌還應用在一致性讀中,不同的是,更新取消日誌僅在 innodb中沒有事務的時候才會被銷毀,因為innodb需要使用更新取消日誌為每個事務構建一致性讀的快照。(最後一句話,個人理解翻譯,建議看原文)
借助於 唐成的資料庫多版本的實現
rr 隔離級別下,事務開啟的時候,獲得當前 未commit的事務id
rc 隔離級別下,事務每次執行sql的時候,獲得當前 未commit的事務id
一致性讀的實現:假設當前事務id為 trx_id_now 未提交的所有事務id為 uncommit_trx_id_list
需要回滾條件:db_trx_id 在 uncommit_trx_id_list 或者 db_trx_id >trx_id_now,回滾的操作:借助於 db_roll_ptr 回滾指標所指向的取消日誌,根據裡面的資訊構建出該條記錄的歷史版本,記歷史版本的事務id為 trx_id_history。db_trx_id = trx_id_history 迴圈判斷,直到不需要回滾為止。
讀取不再需要回滾的歷史版本的記錄資訊
msyql高效能優化中的 rr隔離級別下 mvcc是簡潔版(建議看書)。具體實現如下圖所示:
問題:trx1 begin insert commit
trx2 begin selectselect commit
trx1 的系統版本號 小於 trx2的系統版本號
當trx1 執行insert操作的時候,不管使用trx1的系統版本號還是當前系統版本號即trx2 (按照書中的意思應該是trx2.insert 使用的是當前系統版本號,結合前面的 每開始乙個新的事務,系統版本號都會自動增加),該條插入記錄的版本號 小於等於 事務系統版本號。且沒有刪除版本,所以在第二次select中就會被讀出來。這樣就會造成 不可一致性讀的問題。
trx1的commit在前面就是因為 看到網上的分享說 這個mvcc唯讀已經提交的,所以用這個說明一下還是實現不了rr 。
比較而言,我是更傾向於 官方文件和唐成的這個解釋。mysql高效能優化所說的是簡版mvcc,而不是innodb mvcc的具體實現。
先把這個疑問記錄下來,以後再慢慢看,慢慢思考
怎樣在知乎賺錢? 知乎好物)
關於知乎賺錢的文章應該很多,現在來分享的知乎好物賺錢專案。一起看看關於如何在知乎上做好物分享推薦賺錢?史上最全乾貨。這是官方的鏈結,自己可以開啟看看,如果你覺得太專業,看不懂,那就看給你解釋的。再簡單點,就是知乎淘客。等級達到3級就能開通知乎好物分享的許可權,如果等級沒有達到3級就直接加上你的產品外...
知乎註冊B乎商標被駁回 意指「B面的知乎」
12月8日訊息,企查查app顯示,近期,知乎關聯www.cppcns.com公司智者四海 北京 技術 申請的b乎商程式設計客棧標被予以駁回,商標國際分類涉9類科學儀器。知產局複審認為,申請商標b乎 用作商標使用在指定商品上,有悖於社會公序良俗,整體格調不高。據悉,此前知乎曾上線b乎活動,意指b面的知...
知乎好文推薦
1.哪些愛好可以讓人變得更聰明。ps 有些愛好確實可以無意間激發人的靈感,感悟人生。2.你見過什麼令人深省的商業故事。ps 有些商業知識對以後很有幫助,比如說程式設計師跳槽 下海 3.it前輩教你如何保護身體 ps 必不可少的延壽知識。4.為什麼我看的書越多,越看不起周圍的人。ps 為什麼?你有嗎?...