xuxueli / xxl-job

A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
http://www.xuxueli.com/xxl-job/
GNU General Public License v3.0
27.47k stars 10.86k forks source link

本地线程JobLogReportHelper报SQL错误 #2292

Open LHaon opened 3 years ago

LHaon commented 3 years ago

在83行 // do refresh时 若update操作没有更新内容时,返回的ret为0 执行if语句时,由于trigger_day是唯一索引,所以会导致插入失败。

Mihawk-lf commented 3 years ago

呃呃呃呃。。 什么版本,异常信息等都补充下呗。

LHaon commented 3 years ago

呃呃呃呃。。 什么版本,异常信息等都补充下呗。

版本2.3.0 异常信息

SQL: INSERT INTO xxl_job_log_report ( trigger_day, running_count, suc_count, fail_count ) VALUES ( ?, ?, ?, ? );

Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2021-03-05 00:00:00' for key 'i_trigger_day'

; Duplicate entry '2021-03-05 00:00:00' for key 'i_trigger_day'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2021-03-05 00:00:00' for key 'i_trigger_day' at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:247) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)

Mihawk-lf commented 3 years ago

若update操作没有更新内容时,返回的ret为0

没有更新内容,是成功数,执行中数量和失败数量都不变化吗?还是参数传null?

LHaon commented 3 years ago

若update操作没有更新内容时,返回的ret为0

没有更新内容,是成功数,执行中数量和失败数量都不变化吗?还是参数传null?

就是成功数、失败数这些都没有变化时,会返回0.

Mihawk-lf commented 3 years ago

image

如果不是第一次,这个时间每次都会变化。不会一直有返回0的问题哇。 你现在还有这个异常吗?还是只有调度中心启动的时候报这个错。

LHaon commented 3 years ago

image

如果不是第一次,这个时间每次都会变化。不会一直有返回0的问题哇。 你现在还有这个异常吗?还是只有调度中心启动的时候报这个错。

调度中心启动之后,每隔一分钟会执行一次这个本地线程,更新最近三天任务执行的失败数、成功数等。 image 如上图,每次要更新的对象设置的时间是todayFrom。 image todayFrom每次设置的时间都是当天的0时0分0秒 如今天就是 2021-03-05 00:00:00 先不说i值的变化 而如果表中已经有这一条数据,且该数据没有任何变化,则会返回0 image 接着执行if后面操作,便会SQL异常,此时退出循环,i值不会变化。 可以尝试将report表中的唯一索引为 2021-03-04 00:00:00 ,这行记录删除,启动调度中心, 不会新增唯一索引为 2021-03-04 00:00:00 的记录, 因为i=0更新唯一索引为2021-03-05 00:00:00 的记录时,返回0,导致SQL异常跳出循环。 此后的每一分钟进该线程,设置的时间还是2021-03-05 00:00:00,没变化的情况下更新操作还是会异常。

Mihawk-lf commented 3 years ago

2021-03-04 00:00:00

为什么要删除这条唯一索引那,本来的判断逻辑,按照日期都会变化,每次都会更新成功。

LHaon commented 3 years ago

2021-03-04 00:00:00

为什么要删除这条唯一索引那,本来的判断逻辑,按照日期都会变化,每次都会更新成功。

这个只是一种复现bug的方法。按照日期变化也是近三天的变化,拿今天来说,就一直扫描的是8日、7日、6日。当这个线程第二次执行的时候,唯一索引也是近三天。

Mihawk-lf commented 3 years ago

2021-03-04 00:00:00

为什么要删除这条唯一索引那,本来的判断逻辑,按照日期都会变化,每次都会更新成功。

这个只是一种复现bug的方法。按照日期变化也是近三天的变化,拿今天来说,就一直扫描的是8日、7日、6日。当这个线程第二次执行的时候,唯一索引也是近三天。

这种复现方法,没办法说服xxl修改吧。。他不会认为这是个bug的吧

LHaon commented 3 years ago

2021-03-04 00:00:00

为什么要删除这条唯一索引那,本来的判断逻辑,按照日期都会变化,每次都会更新成功。

这个只是一种复现bug的方法。按照日期变化也是近三天的变化,拿今天来说,就一直扫描的是8日、7日、6日。当这个线程第二次执行的时候,唯一索引也是近三天。

这种复现方法,没办法说服xxl修改吧。。他不会认为这是个bug。

不这样复现的话。本地启动admin也会一直报这个错,只要没有任务在跑。而且,扫描的是近三天,就算i=0的今天有任务在跑有更新,这个语句通过了,当i变成1或者2的时候有没有更新就不一定了(前两天的任务按理来说都没有更新了),没有更新的情况下也会出现这个问题。

bydongxing commented 3 years ago

我也是这个问题,请问解决了吗?