2016年11月11日 星期五

還沒 commit 的資料,會不會紀錄在 transaction log.



昨天有位同事問,程式insert一批資料,但最後還沒有commit,程式就當掉了。這些insert的紀錄,會不會寫進transaction?

以下做個測試,首先執行下列指令,開啟一個交易,新增兩筆資料,但不commit.
begin tran
insert into test0804 values('a3','aaa')

insert into test0804 values('b3','bbb')

接著觀察transaction log,如下圖,我們可以看最後,有兩筆insert的交易,被紀錄在了transaction log中..









由上面的簡單測試,可以知道,尚未commit的資訊,會被寫入transaction log中。
接著我模擬程式掛掉後,DB執行rollback,看看transaction log中的變化






我們可以看到,當一個insert指令被rollback時,其實系統是執行delete,將它刪除,最後再紀錄一筆 abort transaction,用來表明這個交易最後是rollback。

上面的測試,也同時解釋了,當一個異動的SQL執行一段時間後被中斷了。系統在做rollback時也需要相當的時間。




沒有留言:

張貼留言