?最近在做项目时遇到一个问题,同一个方法中两次更新入库,其中一次成功,一次没执行。我先是排查应用程序日志,发现程序日志并没有异常,然后根据执行时间查了mysql的binlog日志。
binlog日志查看脚本如下:
class="sql">/usr/local/mysql/bin/mysqlbinlog -v --start-datetime='2018-12-26 17:55:00' --stop-datetime='2018-12-26 17:57:00' logs/mysql-bin.000004 >/tmp/tmp.sql
?binlog日志显示确实只执行了一次更新操作
### UPDATE `user_currency` ### WHERE ### @1=15 ### @2=203 ### @3=17 ### @4=318.2131053694 ### @5=287.7714971818 ### @6=30.4416081876 ### @7='2018-12-26 17:39:57' ### SET ### @1=15 ### @2=203 ### @3=17 ### @4=348.4720639080 ### @5=318.0304557204 ### @6=30.4416081876 ### @7='2018-12-26 17:39:57' # at 14487394
?update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ?
update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? 对应参数分别是: 0E-20(BigDecimal), 49(Long), 17(Long), 2.7377658553(BigDecimal), 49(Long), 4(Long) 23.30465650830011440000(BigDecimal),59(Long), 17(Long) 0(BigDecimal), 59(Long), 4(Long)
?
我将两次的更新合并到一起,改为批量操作,并且在测试环境开启了sql日志打印。第二天测试部门反馈还是存在这个问题。我把当天的日志拉出来比对,发现在批量更新时sql是有的,奇怪的是其中一个sql中的某个数值是科学计数法。
?
?问题终于找到了,那解决问题就简单多了。mysql是弱类型,直接将科学计数法转成字符串即可解决问题。