1) redo 記錄的是對頁的重做日誌,undo 記錄的是對事務的逆向操作
2) undo 會產生redo,undo的產生也會伴隨這redo的產生,因為重啟恢復的時候,可以通過redo還原這些undo的操作,以達到回滾的目的
1) 用於對事務的回滾
2)用於mvcc
* 在mysql5.1的年代,乙個mysql例項,就只有乙個rollback segment
* 在mysql5.1+ 的年代,乙個mysql例項裡面,可以有128個rollback segment
* 乙個segment 有 1024 個 undo slot,乙個undo slot 對應乙個undo log
* 乙個事務(dml)對應乙個undo log
據此推斷:
1) 5.1 最多能夠承載的併發事務(dml),1 * 1024 = 1024
2)5.1+ 最多能夠承載的併發事務(dml),128 * 1024 = 10w左右
從此可以看出,5.1 之後的版本支援的併發寫入事務數更多,效能更好
1) insert操作產生的undo
2)為什麼要單獨出來,因為insert的undo可以立馬釋放(不需要purge),不需要判斷是否有其他事務引用,本來insert的事務也沒有任何事務可以看見它嘛
1)delete 或者 update 操作產生的undo日誌
2)判斷undo是否可以被刪除,必須看這個undo上面是否被其他事務所引用
3) 如果沒有任何事務引用,那麼可以由後台執行緒purge掉這個undo
1. 每乙個undo log中都有乙個db_trx_id , 這個id記錄的是該undo最近一次被更新的事務id
2. 如果這個id 不在readview(活躍事務列表) 裡面,就可以認為沒事務引用,即可刪除?
1) 5.6之前的版本,undo都是存放在ibdata,也就是所謂的共享表空間裡面的
2) 5.6以及之後的版本,可以配置存放在單獨的undo表空間中
1) delete語句操作的後,只會對其進行delete mark,這些被標記為刪除的記錄只能通過purge來進行物理的刪除,但是並不**空間
2)undo log,如果undo 沒有任何事務再引用,那麼也只能通過purge執行緒來進行物理的刪除,但是並不**空間
1) undo page裡面可以存放多個undo log日誌
2)只有當undo page裡面的所有undo log日誌都被purge掉之後,這個頁的空間才可能被釋放掉,否則這些undo page可以被重用
1. 對於delete --需要undo繫結該記錄才能進行回滾,所以只能打上標記,否則undo指向**呢
delete mark
2. 對於update --原記錄可以物理刪除,因為可以在新插入進來的地方進行undo繫結
* 如果不能原地更新: delete(注意:這裡是直接delete,而不是delete mark) + insert
* 如果可以原地更新,那麼直接update就好
1. 對於delete --不能直接被物理刪除,因為二級索引沒有undo,只能通過打標記,然後回滾。否則如果被物理刪除,則無法回滾
delete mark
2. 對於update --不能直接被物理刪除,因為二級索引沒有undo,只能通過打標記,然後回滾。否則如果被物理刪除,則無法回滾
delete mark + insert
MySQL系列之鎖
分布式鎖 疑問?什麼是共享鎖?共享鎖 共享讀鎖,排他鎖 獨佔寫鎖 鎖機制與innodb鎖演算法 在關係型資料庫中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 myisam採用表級鎖 table level locking innodb支援行...
Mysql系列之鎖機制
一般乙個程式滿,從消耗的角度,乙個是cpu,乙個是io,但有的時候mysql慢,是因為某條sql不小心把整個表給鎖了。鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除了傳統的計算機資源 如cpu,ram,i o 的爭用外,資料也是供很多使用者共享的資源。如何保證資料併發訪問的一致...
MYSQL系列之 鎖與死鎖
mysql 裡面的鎖大致可以分成全域性鎖 表級鎖和行鎖三類 全域性鎖mysql 提供了乙個加全域性讀鎖的方法,命令是 flush tables with read lock ftwrl 當你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 資料更新語句 資料的增刪改...