目录
2.3 观察发现,确实有发送了update的语句,但是最后却发生了rollback
1.1 数据库版本
1.2 数据库sql_mode未开启严格模式
mysql
2.排查
2.1 开启日志模式,用于查看历史执行sql
SET GLOBAL log_output = 'TABLE';SET GLOBAL general_log = 'ON'; //日志开启
2.2 抓取执行sql日志
SELECT * from mysql.general_log where argument <> 'SELECT 1' ORDER BY event_time DESC;
(此处过滤select 1 是因为程序不断尝试通过select 1保持连接可用,所以剔除该项的干扰需要进行过滤)
2.3 观察发现,确实有发送了update的语句,但是最后却发生了rollback
经核对,update语句无误,并且单独拿出执行,能够正常执行成功(但是因为长度超限,同时数据库sql_mode是宽松模式,故update时发生了截断)
2.4 同时观察该时间范围内是否执行了其他语句
- 经观察,期间没有执行其他语句,故排除语句问题、排除其他数据库相关的干扰
- 同时也排除了程序问题(可能大家会怀疑是不是程序额外进行了一些操作,在代码侧进行了校验和阻挡。但是从mysql侧有收到执行请求,故可排除)
2.5 重启服务观察,是否启动时预设了一些参数
发现在连接前确实设置了sql_mode为严格模式
2.6 确认代码位置
mysql-connector-java.jar -> com.mysql.jdbc.initializePropsFromServer -> com.mysql.jdbc.setupServerForTruncationChecks
2.7 总结
服务启动时,已经指明会话级别的sql_mode为严格模式,故字段超长后不会自动截取而是直接报错并回滚