为啥 MySQL mariadb 无故回滚数据?
Posted
技术标签:
【中文标题】为啥 MySQL mariadb 无故回滚数据?【英文标题】:Why MySQL mariadb rollback data without reason?为什么 MySQL mariadb 无故回滚数据? 【发布时间】:2019-05-28 19:09:03 【问题描述】:在不同硬件(如装有 Windows 操作系统的笔记本电脑)中多次使用 mysql 服务器后,在极少数情况下数据会回滚到以前的事务。该算法通常在具有不同客户端的数千个事务中运行良好,但是当关闭应用程序并释放内存时,最后 4 或 10 个事务的数据回滚时,0.01% 的情况下会发生一些事情。该应用程序是桌面应用程序,是使用 .net 和 MySQL 库以及 localhost 站中的 mariadb 10.2 免费版开发的。如果提交失败,则重试。是否有可能某些交易在出错后部分保存数据并且交易没有很好地关闭?提交失败的原因是什么???,或者硬盘故障,或者 Windows 问题。 ???。 如果报告显示数据,则提交正在工作,但在关闭应用程序数据回滚的情况下?为什么 ??? 任何帮助将不胜感激。
【问题讨论】:
我会在代码本身中插入一个日志记录操作,以首先报告提交中的任何错误并重试,即使它成功也是如此。这将创建一个不会显示您的问题是否发生的模式。日志记录操作显示包含的信息可帮助您确定这一切发生的原因、时间和用户,操作系统和计算机 我在使用 COM 模块时看到过类似的问题。当模块没有正确发布时,它所使用的文件很可能是不完整的(未完全保存)。这是错误的用途。应用程序未能调用“关闭”(C# 术语中的 Dispose) 函数。这是由于不正确的应用程序结束 (例如,当用户在工作进行时按下“X”(关闭)按钮时)。这是一个难以跟踪的问题,但请尝试搜索所有“退出路径”以检查所有模块的正确处置。 【参考方案1】:看似随机的ROLLBACKs
有很多原因。
在事务中的每个语句之后以及COMMIT
之后检查错误。 (提交错误可能只发生在基于 Galera 的集群和组复制中。但无论如何都要测试。)
发生错误时,尝试捕获SHOW ENGINE INNODB STATUS;
。开启innodb_print_all_deadlocks
,然后查看日志。
同时,您能描述一下交易吗?更好的是,向我们展示所涉及的 SQL。
【讨论】:
提交是由 ADO.Net mysql 库在 dispose 函数中完成的。事务对象是在 using 语句中创建的。使用 end 时, dispose 正在调用。提交依赖于 .net 引擎的自动调用处置。如果提交抛出异常,则不存在显式回滚或关闭连接。我现在不知道这是否会导致问题,或者默认情况下回滚是在提交失败异常时完成的。 ADO.Net 是官方发布的旧版本。会是这个问题吗?以上是关于为啥 MySQL mariadb 无故回滚数据?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 MariaDB 是我的 Bitnami LAMP 实例中的默认数据库,如何将其切换到 MySQL?