首先把多出来的数据找出来
select
*
from
iocar_fee
where
fee_duty_id = '240822000'
and pay_type = 1
得到结果947
select
*
from
iocar_fee
where
fee_duty_id = '240822000'
and pay_type = 1
and create_time between '2024-08-22T00:00' and '2024-08-22T23:59:59'
结果946 把多余的那条找出来
select *
from iocar_fee
where fee_duty_id = '240822000'
and pay_type = 1
and create_time not between '2024-08-22T00:00' and '2024-08-22T23:59:59';
找到了
一条数据
8月22号ab栋多统计了一条数据 。122408223081在2024-08-23 00:00:00创建,正常班次号应该240823000, 由于新的班次号还没有生成,导致122408223081的班次号使用前一天的240822000
这也就是并发问题吧
为了优化这个问题,可以采取以下几种方法来避免在统计班次时出现数据重复的问题:
### 1. **生成班次号前加锁**
在创建新的班次号时,使用数据库事务或锁机制来确保每次只生成一个有效的班次号,防止并发操作导致班次号错误。
**优化步骤**:
- 在生成新的班次号之前,使用 `SELECT FOR UPDATE` 来锁定相关的行,确保没有其他并发进程在同时生成班次号。
- 确保新的班次号生成成功后再插入数据。
### 2. **延迟数据插入**
将数据插入的操作延迟到新的班次号生成完成之后,这样可以避免插入过程中使用错误的班次号。
**优化步骤**:
- 先生成新的班次号,并确认生成成功。
- 在班次号生成后,才进行数据的插入操作,确保插入的数据使用的是正确的班次号。
### 3. **检查班次号有效性**
(这个时解决问题的关键呀)
在插入数据之前,添加一个校验步骤,确保使用的班次号是当天生成的,而不是前一天的班次号。
**优化步骤**:
- 在插入数据前,检查班次号的生成时间。如果发现使用的是前一天的班次号,则重新生成或等待新的班次号生成后再插入。
### 4. **修正统计逻辑**
如果前面的优化手段无法完全避免问题,可以在统计时加入额外的逻辑,排除掉不符合当天班次的记录。
**优化步骤**:
- 在统计时,加入 `create_time` 的条件,确保只统计当天生成的班次数据。
- 或者在统计时,检查班次号是否与 `create_time` 匹配,不匹配的记录不纳入统计。
通过这些优化措施,可以有效减少或避免由于并发操作导致的数据重复问题,确保统计结果的准确性。