MySQL中begin后事务为什么不提交
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要介绍"MySQL中begin后事务为什么不提交",在日常操作中,相信很多人在MySQL中begin后事务为什么不提交问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年11月09日MySQL中begin后事务为什么不提交
这篇文章主要介绍"MySQL中begin后事务为什么不提交",在日常操作中,相信很多人在MySQL中begin后事务为什么不提交问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"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。一旦设置了个标示将会不自动提交了。
到此,关于"MySQL中begin后事务为什么不提交"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
就是
事务
学习
函数
实际
实际上
更多
流程
帮助
实用
一致
接下来
一致性
事物
代码
快照
文章
方法
时候
注释
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
守好网络安全底线
网络安全 守卫者 捍卫者
软件开发学校哪里好
管理系统软件开发收费明细
剑网三为什么会卡住服务器
海通 软件开发人员
笛卡尔积在数据库中的用法
蚂蚁 独立软件开发商
记忆力训练软件开发
成都市小学网络安全学
开发数据库权限代码
女孩学软件开发男难吗
安卓耗时的读数据库记录集
一款软件运营要不要服务器
上海交行软件开发
中土时间服务器无法了解
国内网络安全技术的发展状况
安卓app测试服务器
网络技术的发展造福和造孽
vb定义数组并放入数据库
网络安全考试截图
宝塔数据库装不上
一个服务器从另一个服务器拿文件
网络安全课攻击虚拟机
谈网络安全的作文
政府网站一般放在什么服务器上
mysql数据库vc技术
网络技术京东数科
b5您不能在安全服务器上玩游戏
医院机房服务器有辐射吗