MySQL中begin后事务为什么不提交
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"MySQL中begin后事务为什么不提交",在日常操作中,相信很多人在MySQL中begin后事务为什么不提交问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年02月02日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安全错误
数据库的锁怎样保障安全
星际战甲数据库扫描仪
有关数据库加密说法不正确
网络安全的三个目标是什么
苍空物语为什么服务器没见了
最新网络安全研究
无锡品牌软件开发一体化
pubg武器数据库
软件开发数据库设计谁做
网络安全检查工作取得的成效
深圳软件开发者平台
服务器 系统 WINPE
数据库技术应用在哪
行云数据库索引
上传失败无法连接服务器怎么办
本地电脑安装数据库服务
利用网络技术发展外贸业务
杭州纽麦得网络技术
中华武术人才数据库
互联网企业科技创新优势
企业产品产量数据库数据
域服务器的dns设置
病毒敏感细胞数据库
linux一般是用于服务器上
ns 2k19服务器关闭了吗
数据库中的隐藏状态
软件开发公司网管软件
广州电商软件开发定制费用
数据库技术与应用期末题库
龙游图腾服务器机柜价格
数据库网络识别技术