为什么MySQL开始后事务没有提交?

分类:编程技术 时间:2024-02-20 15:49 浏览:0 评论:0
0
本文主要介绍“为什么MySQL中begin后事务没有提交?”在日常操作中,相信很多人都会疑惑为什么MySQL中begin后事务没有提交。小编查阅了各种资料,整理出了一个简单又好的解决方案。使用的操作方法,希望能帮助您解答“为什么MySQL中begin后事务没有提交?”的问题!接下来就请跟随小编一起来学习吧!

我今天看了一下。主要过程是跟踪为什么事情在开始后没有提交。最后发现这个判断包含在:
MYSQL_BIN_LOG::commit函数

if (!cache_mngr->trx_cache.is_binlog_empty() &&ending_trans(thd, all) && !trx_stuff_logged)< /pre>

如果begin,ending_trans(thd, all)将返回false,并且order_commit过程不会被调用。 。
那么主要判断为:

boolending_single_stmt_trans(THD* thd, const bool all){ return (!all && !thd->in_multi_stmt_transaction_mode());}

以下是源代码注释和函数:

 如果会话处于多语句事务模式,则返回 TRUE。 OPTION_NOT_AUTOCOMMIT:当自动提交关闭时,多语句事务会在前一个事务结束后在第一个语句上隐式启动。 OPTION_BEGIN:无论自动提交状态如何,都可以使用语句“START”TRANSACTION”、“BEGIN [WORK]”、“[ COMMIT | ROLLBACK] AND CHAIN”等。注意:这并不能告诉您事务是否处于活动状态。会话可以处于多语句事务模式,但没有活动事务,例如,在以下情况下:set @ @autocommit =0; set @a= 3; <-- 这些语句不设置事务隔离级别可串行化; <-- 启动一个活动的刷新表;活跃交易已经开始。 @sa in_active_multi_stmt_transaction() */ inline bool in_multi_stmt_transaction_mode() const { 返回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("信息", ("设置 SERVER_STATUS_IN_TRANS")); if (tst) tst->add_trx_state(thd, TX_EXPLICIT); /* ha_start_concient_s snapshot() 依赖于 OPTION_BEGIN 标志集。 */ if (flags & MYSQL_START_TRANS_OPT_WITH_Conly 会打开一个一致的快照,是一个readview。一旦设置了flags,就不会会自动提交。 

关于“为什么MySQL中begin后事务没有提交”的研究就结束了。希望能够解答大家的疑惑。理论与实践相结合,能够更好的帮助大家学习,去尝试吧!如果您想继续了解更多相关知识,请继续关注网站。小编会继续努力,给大家带来更多实用的文章!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 为什么MySQL开始后事务没有提交?

用户评论