线上的一次MySQL事务问题记录

上周五进行了一个大表删除的操作,在删除的过程中,出现了一点小问题,白白花费了两个小时,我这里记录了一下大概的过程,废话不多说了,直接看过程吧。

当时想进行删除,先测试了一下删除语句的语法,删了一条试了一下,如下:

mysql ::>>select min(id) from XXXX_user_login;+---------+| min(id) |+---------+|   |+---------+ row in set (0.00 sec)mysql ::>>delete from XXXX_user_login where id < ;Query OK, row affected (0.00 sec)mysql ::>>select min(id) from XXXX_user_login;         +---------+| min(id) |+---------+|   |+---------+ row in set (0.00 sec)
[dba_mysql ~]$ /usr/local/mysql/bin/mysql -udba_admin -p -h127.0.0.1 -P4306Enter password: XXXXXXXXXXXXXXXXXXXXXXType 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql ::>>select min(id) from XXXXX_user_login;                  +---------+| min(id) |+---------+|   |+---------+ row in set (0.00 sec)

想想觉得挺奇怪的,是不是我删除错了,或者说删除之后,业务方又重新插入了数据,这不是出问题了么。。。又重新试了几次,都是一样的效果。

这个现象很奇怪,之前没有遇到过,我首先是检查了一下脚本,确认删除的脚本无误后,又查了好半天,最后终于从事务的这个方向找到了一个突破口,怀疑是事务没有提交导致的,于是看了一眼当前事务的参数,如下:

mysql ::>>show variables like '%commit%';   +--------------------------------+-------+| Variable_name         | Value |+--------------------------------+-------+| autocommit           | OFF  || innodb_commit_concurrency   |   || innodb_flush_log_at_trx_commit |   |+--------------------------------+-------+ rows in set (0.00 sec)mysql--dba_admin@127.0.0.1:(none) ::>>mysql ::>>show global variables like '%commit%';+--------------------------------+-------+| Variable_name         | Value |+--------------------------------+-------+| autocommit           | ON  || innodb_commit_concurrency   |   || innodb_flush_log_at_trx_commit |   |+--------------------------------+-------+ rows in set (0.00 sec)

那既然已经定位到了问题,就开始找这个问题的根本原因,最终在配置文件中找到了最根本的原因,如下:

[mysqldump]quickmax_allowed_packet = M[mysql]no-auto-rehashmax_allowed_packet = Mprompt=mysql--\\u@\\h:\\d \\R:\\m:\\s>>init-command="set interactive_timeout=28800;set wait_timeout=28800;set autocommit=0;"

看来还是改的不彻底。

我们知道,mysql加载配置文件有一个顺序,我们可以使用mysql --help|grep my.cnf的命令来查看,经过查看,是因为/etc/my.cnf中的配置也是autocommit=0,所以就把当前这个配置文件的参数给覆盖了,最终,改完/etc/my.cnf文件中的autocommit参数内容之后,重新连接mysql服务器,发现问题解决。

总结,下面几个小的知识点需要注意一下:

1、当发现数据无法删除之后,可以先看看事务提交的参数是否设置成了off

2、使用show variables和show global variables可以分别查看当前会话和全局变量的事务参数;

3、my.cnf文件中的mysql组中的参数是用来控制mysql客户端的配置的。

4、my.cnf文件有加载顺序,改动的时候,需要全部都变更。或者保证只存在一个my.cnf文件。

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. android从服务器下载文件(php+apache+win7+MySql)
  5. JNI 无法确定Bitmap的签名
  6. android webview 中网页数据与js交互
  7. 【有图】android通过jdbc连接mysql(附文件)
  8. Android(安卓)3.0之后开机无法接收系统广播权限原因
  9. Android(安卓)Studio编译报Default interface methods are only

随机推荐

  1. Android触控
  2. Android 发送短信 源代码
  3. android input 事件传递主要流程
  4. android点滴4
  5. Android studio 中调用ndk-build 进行编
  6. android用ViewPager实现欢迎界面
  7. Android通知栏消息(基本文字通知)
  8. Android中获取屏幕的宽和高
  9. MTK Android Driver :camera
  10. Windows下Android开发环境配置的一种方法