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 如果沒有標...