记一次关于MySQL与PHP的蠢事
时间:2022-07-22
本文章向大家介绍记一次关于MySQL与PHP的蠢事,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
事情是这样的
缘由:
一个稍微有些小复杂的事务。首先需要初始化一些记录的值,然后选取一些新的记录,对新的记录进行排序,然后再将排序等信息写入。
出现的问题:
SQL是按照 id in (xxx, xxx) 来写的。
# 这就是问题所在, 按这个查找 会出现一些意料不到的问题。
SELECT * FROM infos WHERE id IN(55001170412000002)
数据库id 存储是使用的 varchar(50), id形如 55001170412000002, 已经超过了默认的int11。
之前的失误
由于内部系统,使用的CI没有考虑注入之类的安全问题。 直接使用客户端传递的字段 拼接SQL。前端使用Ajax传递的数字型列表。后台处理方式是简单的增加了 ''。
这个其实是没问题的。问题是 在SQL中,使用了未添加 '' 的列表。
/* $ids_ 为处理过的字符串型列表、$ids 为原始数字型的列表 */
SELECT * FROM '.self::$infos.' WHERE id IN('.$ids.') ORDER BY FIELD(id, '.$ids_.');
第一次错误的处理
在前端 将数字型列表 修改为 字符串型列表。
然后发现后端有处理过的$ids_,然后把SQL修改 全部使用处理过的。
并将前端的修改force push,回滚到未修改的版本。第一次失误:(此处JS存在缓存问题...但当时还没有发现)。
修改之后发现更严重的问题。前端修改排序之后,提交一直等待,然后
Query error: Lock wait timeout exceeded; try restarting transaction
数据库死锁....
第二次修改
第二次失误:使用Postman模拟数据提交,但是却没有再次确认浏览器提交的数据格式。
这也导致了,使用Postman偶尔可以正常提交,多数也是死锁的情况。
第三次修改
第三次失误:粗心的忽略了后台数据库SQL本身报错。也就是 给列表字段加了两次 '''' 单引号。
Query error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xxxx'
第四个失误:而不是第四次。发现 跟着CI官网的 数据库事务。并没有 try...catch...
这时应该真相就出来了。
开启事务-->执行出错-->异常退出 (并没有回滚或者提交导致)
总结
数据库事务 一定要回滚或者提交
try {
trans()
commit()
} catch(Exception e) {
rollback()
} finally {
close()?
}
MySQL 死锁相关
mysql> SELECT * FROM information_schema.INNODB_TRXG
*************************** 1. row ***************************
trx_id: 8483802
trx_state: RUNNING
trx_started: 2017-04-24 20:53:54
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 12
trx_mysql_thread_id: 111844
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 5
trx_lock_memory_bytes: 1248
trx_rows_locked: 15
trx_rows_modified: 7
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.04 sec)
# 确认无效后,直接kill掉即可
mysql> kill 111844;
Query OK, 0 rows affected (0.04 sec)
- 机器学习中分类与回归的差异
- 自然语言处理指南(第1部分)
- GreenDao 兼容升级,保留旧数据的---全方面解决方案
- 基于 xorm 的服务端框架 XGoServer
- 全面总结: Golang 调用 C/C++,例子式教程
- 架构之路(六):把框架拉出来
- 第二届游戏运营技术论坛——云时代的游戏运营之道
- 如何才能准确测量 APP 的功耗?
- 可用性更高:设计优秀的MySQL和Percona XtraDB集群
- 如何使用scikit-learn在Python中生成测试数据集
- OpenStack Neutron之持续测试
- 干货丨 用 Python 进行股票分析
- 小故事:架构师需要做什么?
- 浅谈用Python计算文本BLEU分数
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- jQuery (事件、拷贝)对象
- 10.6 border-color简写属性:如何理解四值语法?
- jQuery 插件
- dotnet 基于 dotnet format 的 GitHub Action 自动代码格式化机器人
- 10.7 border-width边框粗细:outline与border有什么不同?
- WPF 非客户区的触摸和鼠标点击响应
- Flink 解决 No ExecutorFactory found to execute the application
- 10.8 如何用js验证一下boz-sizing样式对块级盒子大小的影响?
- 10.9 块级盒子的内外边距:如何使用box-sizing重新定义盒子模式?
- 10.10 圆角边框border-radius与盒子阴影:如何使用它实现圆等特殊形状?
- 函数内部的this指向
- 正则表达式在js中的使用
- 10.11 如何使用git?
- 10.13 如何使用transform样式?
- 正则表达式中的特殊字符