1、场景
jdbc配置:jdbc.url=xxxxxxxxx&useAffectedRows=true
数据库字段update_time为datetime 类型
sql语句:update xxx set a=#{a},update_time=now() where id=#{id}
触发场景:高并发下,1秒内连续两次update请求,第二次update返回为0。
2、原因分析
一般我们建表时都不指定日期格式精度,默认就是精确到秒,jdbc如果设置了useAffectedRows=true代表返回受影响的行数,由于只能精确到秒,所以第二次更新并没有影响到任何一行,直接返回0。
3、解决方案
3.1、jdbc不指定useAffectedRows=true,默认返回的是记录的 matched 的条数。
3.2、建表时日期类型精确到毫秒,datetime(3)、datetime(6)、timestamp(3)、timestamp(6),3代表保留3位毫秒数、6代表6位毫秒数。(目前我们大部分表应该只精确到了秒)