|
我在想,是否可以利用数据库自身的锁来解决。把时间比大小推到数据库更新的时候计算,比如下面这样:
```sql
UPDATE work_sessions
SET
start_time = LEAST(start_time, :new_biz_time), -- LEAST 是 SQL 函数,取最小值
end_time = GREATEST(end_time, :new_biz_time) -- GREATEST 是 SQL 函数,取最大值
WHERE
user_id = :user_id AND date = :date;
```
利用数据库本身的原子性来更新时间范围,是不是也能达到想要的结果?
对于休息间隔重新计算,我觉得可以增加一个缓存层,每次来新的 biz_time 先和缓存中的内容进行判断,超过 20 分钟或者跨天的话就使用 insert 新开一条记录。
如果上面这种方式也不合适的话,我觉得也可以从时间排序方面入手,你希望保证的是“近实时”的分析,那我这里假设分析结果可以延迟 1 分钟更新,那么使用一个以 biz_time 作为 key 的小顶堆的数据结构接收那些并发的请求,然后只有当堆顶的 biz_time 与当前相差超过 1 分钟之后才会取数据更新入库,这样可以把一分钟之内的数据乱序问题抹除。然后同样将时间戳大小对比丢给数据库更新的时候计算,不知道这样是否能满足你的需求。 |