MySQL記錄非事務性語句 疑問

2021-09-21 16:47:52 字數 1370 閱讀 1399

mysql 版本:mariadb 5.5.30

os版本: centos 5.6 x86_64

摘自網路一段話:「事務是按照提交的順序寫入binlog內,mysqlserver 為區分不同的執行緒的語句,為每個執行緒都保持乙個事務快取,事務中執行的每個語句都放在事務快取中,然後事務快取的內容被複製到binlog中,且在事務提交時被清空。」

以上這句話我是認同的,下面我們**下binlog如何記錄非事務性語句;

當沒有事務活動時,非事務性語句會被直接寫入binlog裡面而不需要經過事務快取;

如果乙個事務是活動的,可分為下面的情況處理:

1、語句被標記為事務的,則被寫入事務快取(這句話不需要驗證)

2、語句沒有被標記為事務性的,而且事務快取中沒有語句(即該語句作為事務的開頭),則該語句被直接寫入binlog;

驗證過程: 

myisam 表: not_trans;  innodb 表:trans; 

commit;之後;驗證binlog是否有 insert into not_trans 記錄

對於 binlog format: mixed 和 為statement的時候 都會有該記錄;所以第二種情況是正確的

3、語句未被標記為事務性的,但事務快取中有該事務的其他語句,則該語句被寫入事務快取

驗證過程: 對事務性表和非事務性表 放在乙個事務中,插入後不進行commit 而是進行 rollback操作(注:此時根據會提示warning,非事務性表無法回滾),此時按照第三種情況來說,binlog裡面應該沒有任何binlog記錄;

myisam 表: not_trans;  innodb 表:trans;

檢視binlog進行驗證:

對於binlog mixed  和statement 格式儲存, binlog裡面都會有 非事務性語句的記錄,並且後面是 rollback結尾;

我覺得第三種情況是錯誤的,(對於這次測試有什麼疑問大家可以共同**)

補充:第三種情況 非事務性語句也許已經寫入到事務快取中,但由於在本實驗中rollback失敗,所以非事務性語句直接寫入到binlog中;或許是非事務性語句根本就沒寫入到事務快取中,未排除這兩種可能,各位有什麼方法來驗證下嗎?

這個時候我們要提一下mysql的乙個相關引數:binlog_direct_non_transactional_updates

首先這個是讓非事務性的語句直接寫入到binlog裡面,但該引數有些雞肋啦。在binlog format 為 statement的時候,該引數能起到作用,目前和版本沒有關係;但在mysql 5.5.5之後的版本,對於binlog format 為 mixed 或者 row 模式的情況下,該引數對binlog 是沒有任何影響的!(大多數人使用的是mixed模式吧)

事務性的特點

原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務前後資料的完整性必須保持一致。隔離性 isolation 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所...

事務性的特點

原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務前後資料的完整性必須保持一致。隔離性 isolation 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所...

mysql二進位制日誌處理事務和非事務性語句的區別

在事務性語句執行過程中,伺服器將會進行額外的處理,在伺服器執行時多個事務是並行執行的,為了把他們的記錄在一起,需要引入事務快取的概念。在事務完成被提交的時候一同重新整理到二進位制日誌。對於非事務性語句的處理。遵循以下 3條規則 1 如果非事務性語句被標記為事務性,那麼將被寫入事務緩衝。2 如果沒有標...