事務資料庫回滾
❶ mysql命令行下怎樣實現數據的回滾操作
當啟動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回滾其它的事務
❷ 資料庫中前滾、回滾什麼意思
前滾是將未完成的操作繼續完成,回滾是將執行完的操作回復過來
❸ 什麼是SQLSERVER事務處理和事務回滾
所謂事務是用戶定義的一個資料庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。例如,在關系資料庫中,一個事務可以是一條SQL語句、一組SQL語句或整個程序。
簡單舉個例子就是你要同時修改資料庫中兩個不同表的時候,如果它們不是一個事務的話,當第一個表修改完,可是第二表改修出現了異常而沒能修改的情況下,就只有第二個表回到未修改之前的狀態,而第一個表已經被修改完畢。
而當你把它們設定為一個事務的時候,當第一個表修改完,可是第二表改修出現了異常而沒能修改的情況下,第一個表和第二個表都要回到未修改的狀態!這就是所謂的事務回滾。
❹ SQL事務回滾
--創建存儲過程
alter proc proc_aa_aa1
(@id int,@name varchar(255) ,@sex char(2))
as
--創建事務
begin Transaction tran_charge
--定義變數記錄錯誤數
declare @reeSum int
set @reeSum=0
--嘗試執行sql語句
begin try
insert into aa(id,name,sex) VALUES ('1','as','男')
set @reeSum=@reeSum+@@ERROR
--@@error當前一個語句遇到錯誤,則返回錯誤號,否則返回0。需要注意的是@ERROR在每一條語句執行後會被立刻重置
insert into aa1(id,name,sex) VALUES ('1','as','男女')
print @@ERROR
set @reeSum=@reeSum+@@ERROR
end try
begin catch
--列印錯誤信息
print '錯誤編號:'+convert(varchar,error_number())+'錯誤消息'+error_message()
print @reeSum
set @reeSum=@reeSum+@@ERROR
end catch
print '111'
print @reeSum
if(@reeSum>0)--有錯誤
rollback Transaction tran_charge --回滾事務
else
commit Transaction tran_charge--提交事務
--通過調用存儲過程,給相應的參數,
exec proc_aa_aa1'2','1','3'
@@ROWCOUNT //返回
@@ERROR //返回錯誤碼
insert into aa(id,name,sex) VALUES ('1','as','男')
insert into aa1(id,name,sex) VALUES ('1','as','男女')
delete from aa
delete from aa1
select * from aa
select * from aa1
❺ 什麼是事務事務中的提交和回滾是什麼意思
1、事務就是指准備要做的或所做的事情,在計算機語言中是指訪問並可能更新資料庫中各種數據項的一個程序單元,也是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
2、提交事務:Commit Transaction,成功的結束,將所有的DML語句操作歷史記錄和底層硬碟數據來一次同步
3、事務回滾:End Transaction,失敗的結束,將所有的DML(insert、update、delete)語句操作歷史記錄全部清空。
所謂回滾事務,簡單來說就是當一個事務的某一個操作發生問題時,整個事務可以回滾掉,就像沒有做任何操作一樣,換言之當發生錯誤或事務被取消,則回滾事務。
當開啟事務之後,所有的操作都會被存儲在事務日誌中,而只有當我們進行提交事務的操作後,才會將我們更新的數據同步到數據表中。
(5)事務資料庫回滾擴展閱讀
在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
和事務相關的語句
開啟事務:Start Transaction
事務結束:End Transaction
提交事務:Commit Transaction
回滾事務:Rollback Transaction
❻ android 資料庫 回滾事務是什麼意思
事務就是一系列對資料庫的操作,這些操作要麼全部正確執行,一旦有一個操作執行失敗,就要讓全部操作都執行失敗,也就是已經執行成功的操作需要撤銷掉。將一系列相關的操作封裝為事務是為了保證資料庫的一致性。
將一個事務的所有操作對資料庫所作出的改變全部撤銷的過程就是回滾事務。事務的回滾會在出現事務操作執行失敗時自動發生,也可以使用命令顯式的讓任何事務提交或者回滾。
❼ 請問:C# 在做項目中,如何處理 對資料庫操作的事務回滾
其實回滾簡單理解就是之前操作的反向操作,在addtable1中定義了插入方法,與之相反,回滾的話就是定義一種刪除方法,把之前插入的數據刪掉就好了。這個你應該可以做到的吧!
還有給你個忠告,以後做資料庫操作的時候,最好先備份資料庫,這是防止這種情況發生的最簡便的方法。
另外,當你要對資料庫進行相應的操作的時候,提前分析好回滾操作,特別是邏輯,回滾很容易因為邏輯關系似的資料庫面目全非,因為對資料庫的操作很多是在操作時候是1-〉2->3->4這樣的邏輯,回滾的時候就要進行2->1->4->3這樣的邏輯。
如果不行的話再給我留言
❽ SQL語言中,用於事務回滾的語句是什麼
回滾要放在事務裡面進行,才能進行回滾;sql裡面的事務使用關鍵字TransAction
1:可以用try catch捕獲
begin try
begin tran
update table set a=1;
commit tran
end Try
begin catch
rollback tran
end catch
2:可以使用error 全局變數
begin tran
update tablename set ad=1111
if @@error<>0 begin rollback end
commit tran
注意:如果一個事務寫了 begin trans ,後面一定要跟上 commit tran或 rollback transaction ,否則可能導致被鎖