佇列Rollback的設計

2021-08-27 04:32:33 字數 903 閱讀 1453

有乙個佇列包含了n個block,每個block是佇列中的乙個元素。block很大,乙個block中可以容納m個item(m>1)。

這個佇列的基本使用模式就是:不斷的有item過來,往block裡面填充,一旦block滿,就建立乙個新的block,後繼item都填往新block。

rollback的定義:最後乙個item填充到block中後,由於出現了某種錯誤(如超出最大使用記憶體限制),需要把這個item刪除掉,將佇列恢復到刪除前的狀態。

有這麼幾種場景需要考慮:

1. 隊列為空,插入第乙個item後就需要回滾,插入前後佇列中新增了乙個block

2. 某個block插入第x個item後需要回滾,插入前後並沒有建立新的block

3. 某個block插入第x個item時發現block滿,新建乙個block,將item插入到新block後回滾,插入前後佇列中新增了乙個block

2這種場景比較容易處理,只要插入前記錄下rollback_pos,需要回滾的時候,將block中的pos恢復到rollback_pos即可。

1、3兩種場景邏輯上很相似,程式設計上略有區別:1中佇列頭指標為null,3中佇列頭指標不為null,需要分別處理。

場景1的處理辦法:發現需要回滾,free新建的block,令佇列頭指標為null,pos為0

場景3的處理辦法:插入前記錄rollback_block和rollback_pos,發現需要回滾,free新建的block,令佇列頭指標=rollback_block,pos=rollback_pos

這裡最複雜的部分是free新建的block,如果能不去free block,問題會簡單很多,三個場景可以用乙個通用的演算法解決:

插入前記錄rollback_block和rollback_pos,發現需要回滾,令佇列頭指標=rollback_block,pos=rollback_pos

oracle中rollback的使用

rollback使用 sql create table tbl name varchar2 10 table created.sql insert into tbl values zhiqiao 1 row created.sql select from tbl name zhiqiao sql d...

rollback與flashback的區別

1 flashback 閃回 實現閃回資料庫的基礎是閃回日誌,配置了閃回資料庫後會自動建立閃回日誌,只要資料庫裡資料發生變化,就會將資料被修改前舊址放入閃回日誌。閃回主要用於出現邏輯錯誤時比如誤刪除表,誤刪除使用者等,快速完成對業務資料的恢復。flashback具體來說有 4種常用的操作,這幾種操作...

MySQL的rollback 事務回滾

mysql version 5.7 首先 事務回滾只用於dml,不適用於ddl。對於ddl的回滾,以後有時間再說。關於rollback和commit,mysql的文件已經說的很詳細了,選擇其中乙個簡單的例子再絮叨下 mysql create table customer a int,b char 2...