1. 對於一個key-value類型的資料庫,如何設計資料庫的rollback操作
1、檢查key是否存在,存在的話,將老的value先臨時保存,然後執行set操作,rollback的時候,將原來的value再set回去
2、key不存在,先執行set操作,rollback的時候,del掉key
2. 資料庫中 rollback 和 commit 是什麼時候用的 作用是什麼 有什麼區別 舉幾個簡單的
COMMIT是表示【提交】,就是提交事務的所有操作。
具體地說,就是將事務中的所有對資料庫的更新寫回到磁碟上的物理資料庫中去,事務正常結束。
ROLLBACK指的是【回滾】,即是在事務的運行過程中,發生了某種故障,事務不能繼續執行,系統將事務中對資料庫的所有的已完成的操作全部撤銷,回滾到事務開始之前的狀態。
總之,就是一個成功,一個不成功
3. mysql binlog 中的 為什麼會有 rollback
當啟動Binlog後,事務會產生Binlog Event,這些Event被看做事務數據的一部分。因此要保證事務的Binlog Event和InnoDB引擎中的數據的一致性。所以帶Binlog的CrashSafe要求MySQL宕機重啟後能夠保證:
- 所有已經提交的事務的數據仍然存在。
- 所有沒有提交的事務的數據自動回滾。
- 所有已經提交了的事務的Binlog Event也仍然存在。
- 所有沒有提交事務沒有記錄Binlog Event。
這些要求很好理解,如果重啟後數據還在,但是Binlog Event沒有了,就沒辦法復制到其他節點上了。如果重啟後,數據沒了,但是Binlog Event還在,那麼不存在的數據就會被復制到其他節點上,從而導致主從的不一致。
為了保證帶Binlog的CrashSafe,MySQL內部使用的兩階段提交(Two Phase Commit)。
2 - MySQL的Two Phase Commit(2PC)
在開啟Binlog後,MySQL內部會自動將普通事務當做一個XA事務來處理:
- 自動為每個事務分配一個唯一的ID
- COMMIT會被自動的分成Prepare和Commit兩個階段。
- Binlog會被當做事務協調者(Transaction Coordinator),Binlog Event會被當做協調者日誌。
想了解2PC,可以參考文檔:【https://en.wikipedia.org/wiki/Two-phase_commit_protocol。】
- 分布式事務ID(XID)
使用2PC時,MySQL會自動的為每一個事務分配一個ID,叫XID。XID是唯一的,每個事務的XID都不相同。XID會分別被Binlog和InnoDB記入日誌中,供恢復時使用。MySQ內部的XID由三部分組成:
- 前綴部分
前綴部分是字元串"MySQLXid"
- Server ID部分
當前MySQL的server_id
- query_id部分
為了保證XID的的唯一性,數字部分使用了query_id。MySQL內部會自動的為每一個語句分配一個query_id,全局唯一。
參考代碼:sql/xa。h的struct xid_t結構。
- 事務的協調者Binlog
Binlog在2PC中充當了事務的協調者(Transaction Coordinator)。由Binlog來通知InnoDB引擎來執行prepare,commit或者rollback的步驟。事務提交的整個過程如下:
1. 協調者准備階段(Prepare Phase)
告訴引擎做Prepare,InnoDB更改事務狀態,並將Redo Log刷入磁碟。
2. 協調者提交階段(Commit Phase)
2.1 記錄協調者日誌,即Binlog日誌。
2.2 告訴引擎做commit。
注意:記錄Binlog是在InnoDB引擎Prepare(即Redo Log寫入磁碟)之後,這點至關重要。
在MySQ的代碼中將協調者叫做tc_log。在MySQL啟動時,tc_log將被初始化為mysql_bin_log對象。參考sql/binlog.cc中的init_server_components():
if (opt_bin_log) tc_log= &mysql_bin_log;
而在事務提交時,會依次執行:
tc_log->prepare();
tc_log->commit();
參考代碼:sql/binlog.cc中的ha_commit_trans()。當mysql_bin_log是tc_log時,prepare和commit的代碼在sql/binlog.cc中:
MYSQL_BIN_LOG::prepare();
MYSQL_BIN_LOG::commit();
-協調者日誌Xid_log_event
作為協調者,Binlog需要將事務的XID記入日誌,供恢復時使用。Xid_log_event有以下幾個特點:
- 僅記錄query_id
因為前綴部分不變,server_id已經記錄在Event Header中,Xid_log_event中只記錄query_id部分。
- 標志事務的結束
在Binlog中相當於一個事務的COMMIT語句。
一個事務在Binlog中看起來時這樣的:
Query_log_event("BEGIN");DML產生的events; Xid_log_event;
- DDL沒有BEGIN,也沒有Xid_log_event 。
- 僅InnoDB的DML會產生Xid_log_event
因為MyISAM不支持2PC所以不能用Xid_log_event ,但會有COMMIT Event。
Query_log_event("BEGIN");DML產生的events;Query_log_event("COMMIT");
問題:Query_log_event("COMMIT")和Xid_log_event 有不同的影響嗎?
- Xid_log_event 中的Xid可以幫助master實現CrashSafe。
- Slave的CrashSafe不依賴Xid_log_event
事務在Slave上重做時,會重新產生XID。所以Slave伺服器的CrashSafe並不依賴於Xid_log_event 。Xid_log_event 和Query_log_event("COMMIT"),只是作為事務的結尾,告訴Slave Applier去提交這個事務。因此二者在Slave上的影響是一樣的。
3 - 恢復(Recovery)
這個機制是如何保證MySQL的CrashSafe的呢,我們來分析一下。這里我們假設用戶設置了以下參數來保證可靠性:
- 恢復前事務的狀態
在恢復開始前事務有以下幾種狀態:
- InnoDB中已經提交
根據前面2PC的過程,可知Binlog中也一定記錄了該事務的的Events。所以這種事務是一致的不需要處理。
- InnoDB中是prepared狀態,Binlog中有該事務的Events。
需要通知InnoDB提交這些事務。
- InnoDB中是prepared狀態,Binlog中沒有該事務的Events。
因為Binlog還沒記錄,需要通知InnoDB回滾這些事務。
- Before InnoDB Prepare
事務可能還沒執行完,因此InnoDB中的狀態還沒有prepare。根據2PC的過程,Binlog中也沒有該事務的events。 需要通知InnoDB回滾這些事務。
- 恢復過程
從上面的事務狀態可以看出:恢復時事務要提交還是回滾,是由Binlog來決定的。
- 事務的Xid_log_event 存在,就要提交。
- 事務的Xid_log_event 不存在,就要回滾。
恢復的過程非常簡單:
- 從Binlog中讀出所有的Xid_log_event
- 告訴InnoDB提交這些XID的事務
- InnoDB回滾其它的事務
4. SQL語句如何rollback
rollback是針對事務的,你如果沒有在執行語句之前開啟事務,那麼無法rollback,建議你還是想別的辦法吧,事務語句如下(sqlserver的給你借鑒):
--開啟事務
begin tran
--執行操作
update Accounts_UsersExp set TelPhone=123456 where userid=14
--執行錯誤事務回滾
rollback
--如果正確進行事務提交
commit
可以勾選一句執行一句,但是commit了就不能rollback
5. JDBC連接mysql資料庫有個rollback()函數嗎這個函數怎麼樣求教
有。conn.rollback()。
但是如果 rollback 緊接著 close,是不用調用的,因為 close 會自動調用 rollback。
6. 什麼是事務 COMMIT和ROLLBACK操作各做什麼事情
訪問並可能更新資料庫中各種數據項的一個程序執行單元(unit)。事務通常由高級資料庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起。
並用形如begin transaction和end transaction語句(或函數調用)來界定。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。
commit是提交操作,將操作顯式提交到資料庫,這里需要注意,並不是所有sql語句執行完都需要進行commit操作,有些操作執行完就已經自動隱式提交到資料庫了。
ROLLBACK回滾操作,在commit操作之前可以使用rollback 操作回滾到之前的狀態。
執行完sql語句之後,處理的數據都會放在回滾段中(除了 SELECT 語句),等待用戶進行提交(COMMIT)或者回滾 (ROLLBACK),當用戶執行 COMMIT / ROLLBACK後,放在回滾段中的數據就會被刪除。
(6)資料庫rollback擴展閱讀:
COMMIT/ROLLBACK,都是用在執行 DML 語句之後的。所謂 DML 語句就是 INSERT / DELETE / UPDATE / SELECT ,而 CREATE TABLE / VIEW 之類的語句,是 DDL。
DML 語句,執行完之後,處理的數據,都會放在回滾段中(除了 SELECT 語句),等待用戶進行提交(COMMIT)或者回滾 (ROLLBACK),當用戶執行COMMIT/ROLLBACK後,放在回滾段中的數據就會被刪除。
所有的 DML 語句都是要顯式提交了,所謂「顯式提交」,就是要執行COMMIT/ROLLBACK。
而其他的諸如 DDL 語句的,都是隱式提交的。
就是說,不用進行COMMIT/ROLLBACK。在運行那些非 DML 語句後,ORACLE 已經進行了隱式提交,例如 CREATE TABLE,在運行腳本後,表已經建好了,並不在需要再進行顯式提交。
7. 資料庫中的rollback怎麼個使用法。。。
rollback 回滾的意思。 就是資料庫里做修改後 ( update ,insert , delete)未commit 之前 使用rollback 可以恢復數據到修改之前。
8. oracle rollback是回滾整個資料庫還是回滾某個用戶的操作
Rollback是指一個用戶在某一次事務提交之前的回滾,使得本次的操作無效。
SQL>InsertintoT_GHDWMLValues('G31003','哈爾濱自然公司','哈自然','鄭毅','13936656561');
SQL>SavepointA;
SQL>UpdateT_GHDWMLsetlxr='陳宇'wheredwbm=』G31003』;
SQL>SavepointB;
SQL>DeleteFromT_GHDWMLwheredwbm=』G31003』;
SQL>Rollback;
SQL>Rollback;
SQL>Rollback;
9. 資料庫的問題,事務定義中,COMMIT語句和ROLLBACK語句的作用是什麼
Commit表示提交。Rollback的意思是回滾。
甲骨文公司(是一家全球資料庫軟體公司,總部位於美國加州紅杉城。2008年,按收入計算,甲骨文公司是全球第三大軟體公司,僅次於微軟和IBM。
Oracle資料庫產品被財富榜上的前1000家公司使用,也被許多大型網站使用。甲骨文公司於1989年進入中國,在北京、上海、廣州和成都設有分支機構。
(9)資料庫rollback擴展閱讀:
資料庫技術的應用及特點
資料庫最初是用作大型公司或組織中大規模事務處理的基礎。後來,隨著個人電腦的普及,將資料庫技術移植到pc中,實現單用戶個人資料庫應用。然後由於PC機在工作組內聯網,資料庫技術被移植到工作組級。
資料庫現在在Internet和Intranet上廣泛使用。在20世紀60年代中期,資料庫技術被用來解決文件處理系統的問題。當時,資料庫處理技術仍然非常脆弱,經常出現應用程序無法提交的情況。
20世紀70年代,關系模型的誕生為資料庫專家提供了一種構建和處理資料庫的標准方法,促進了關系資料庫的發展和應用。
現在,資料庫技術與Internet技術一起被用來在組織內聯網、部門區域網、甚至WWW上發布資料庫數據。
10. oracle資料庫引起自動回滾的原因
比如說你的事務未提交進程意外終止(
掉線
啊,點擊
叉叉
退出連接啊)未提交的數據全部
回滾
。或者在你的事務提交過程中,數據違反約束條件,事務內部出現錯誤被終止,則該事務中所有操作也被自動回滾。還有其他一些情況,這兩個是主要的。