MySQL:begin後事務為什麼不提交
今天順便看了一下,主要流程就是跟蹤為什麼begin後事物不會提交,最後發現在:
MYSQL_BIN_LOG::commit 函式中包含這個判斷
if (!cache_mngr->trx_cache.is_binlog_empty() && ending_trans(thd, all) && !trx_stuff_logged)
如果begin的話ending_trans(thd, all) 將會返回為false,也就不會呼叫 order_commit流程了。
那麼其主要判斷就是:
bool ending_single_stmt_trans(THD* thd, const bool all){ return (!all && !thd->in_multi_stmt_transaction_mode()); }
下面是原始碼註釋和函式:
Returns TRUE if session is in a multi-statement transaction mode. OPTION_NOT_AUTOCOMMIT: When autocommit is off, a multi-statement transaction is implicitly started on the first statement after a previous transaction has been ended. OPTION_BEGIN: Regardless of the autocommit status, a multi-statement transaction can be explicitly started with the statements "START TRANSACTION", "BEGIN [WORK]", "[COMMIT | ROLLBACK] AND CHAIN", etc. Note: this doesn't tell you whether a transaction is active. A session can be in multi-statement transaction mode, and yet have no active transaction, e.g., in case of: set @@autocommit=0; set @a= 3; <-- these statements don't set transaction isolation level serializable; <-- start an active flush tables; <-- transaction I.e. for the above scenario this function returns TRUE, even though no active transaction has begun. @sa in_active_multi_stmt_transaction() */ inline bool in_multi_stmt_transaction_mode() const { return variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN); }
其實就是在判斷是都option_bits的對應位上為1。因此簡單了我們就看看什麼時候設定OPTION_BEGIN位就好了。
實際上是函式trans_begin設定的下面是這段程式碼:
thd->variables.option_bits|= OPTION_BEGIN; thd->server_status|= SERVER_STATUS_IN_TRANS; if (thd->tx_read_only) thd->server_status|= SERVER_STATUS_IN_TRANS_READONLY; DBUG_PRINT("info", ("setting SERVER_STATUS_IN_TRANS")); if (tst) tst->add_trx_state(thd, TX_EXPLICIT); /* ha_start_consistent_snapshot() relies on OPTION_BEGIN flag set. */ if (flags & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT) { if (tst) tst->add_trx_state(thd, TX_WITH_SNAPSHOT); res= ha_start_consistent_snapshot(thd); }
實際上就是在MySQL層設定一些標示,如果是 START TRANSACTION WITH CONSISTENT SNAPSHOT 還會開啟一個一致性快照,就是一個readview。一旦設定了個標示將會不自動提交了。
作者微信:gp_22389860
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2645353/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL事務兩段式提交MySql
- MySQL 事務提交過程MySql
- MySQL事務提交流程概述MySql
- MySQl事務建立,開始以及提交MySql
- 檢視mysql沒提交的事務MySql
- 探究MySQL的DML提交事務的意義和DQL是否有必要提交事務MySql
- 為什麼要在事務結束後,立即進行COMMIT?MIT
- MySQL實現事務的提交和回滾MySql
- MySQL的事務隔離級別是什麼?MySql
- 面試官:什麼是MySQL 事務與 MVCC 原理?面試MySqlMVC
- 為什麼說Docker 不適合跑 MySQL?DockerMySql
- 為什麼我的mysql配不起來MySql
- mysql隱式提交事務transaction一點筆記MySql筆記
- MySQL事務提交的三個階段介紹MySql
- 為什麼我們需要資料庫事務資料庫
- MySQL索引那些事:什麼是索引?為什麼加索引就查得快了?MySql索引
- 第15節:MySQL層事務提交流程簡析MySql
- 十五:MySQL層事務提交流程簡析(筆記)MySql筆記
- mysql 5.5 lock tables與隱式事務提交commitMySqlMIT
- 分散式事務的兩階段提交和三階段提交分別有什麼優缺點?分散式
- 為什麼在 Redis 實現 Lua 指令碼事務?Redis指令碼
- java 事務提交/回滾Java
- SQL Server 查出未提交事務(長事務)SQLSQLServer
- MySQL的事務預設隔離級別是什麼MySql
- 為什麼不讓用join?《死磕MySQL系列 十六》MySql
- MySQL事務還沒提交,Canal就能讀到訊息了?MySql
- 一文帶你深度解析MySQL 8.0事務提交原理MySql
- mysql 為什麼很多網際網路公司選擇了讀可提交MySql
- vitess兩階段提交事務Vite
- 什麼是事務、事務特性、事務隔離級別、spring事務傳播特性?Spring
- JAVA執行緒池原理原始碼解析—為什麼啟動一個執行緒池,提交一個任務後,Main方法不會退出?Java執行緒原始碼AI
- MySQL 為什麼全文索引查中文找不結果MySql索引
- 為什麼不建議在 MySQL 中使用 UTF-8?MySql
- mysql 事務MySql
- mysql事務MySql
- 為DbContextScope新增資料庫事務提交完成事件Context資料庫事件
- oracle為什麼不走索引Oracle索引
- 為什麼MySQL沒有負載,但交易卻跑不動?MySql負載