gpt4 book ai didi

java - 如何使用 JPA 以并发安全的方式获取非重叠日期范围中的间隙?

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:30 25 4
gpt4 key购买 nike

问题

假设我有以下实体:

@Entity
public class TimeSlot {

@Id
private DateTime start;
private DateTime end;

// other properties and accessors
}

我有几个这样的对象存储在 SQL 数据库中,我可以保证它们不会重叠,但这些范围之间可能存在间隙。现在,我想实现一个函数,在给定开始日期和结束日期的情况下,将在给定时间间隔的每个间隙中创建并保留一个新的 TimeSlot:

public List<TimeSlot> aquireGaps(DateTime start, DateTime end);

例子

为了使其更具体,假设我们只使用整数而不是日期。我的表格现在看起来像这样:

+-------+-----+
| start | end |
+-------+-----+
| 1 | 5 |
| 8 | 12 |
| 20 | 24 |
+-------+-----+

调用函数 aquireGaps(3, 22) 后,我希望表格看起来像这样:

+-------+-----+
| start | end |
+-------+-----+
| 1 | 5 |
| 6 | 7 | <-- new interval fills gap
| 8 | 12 |
| 13 | 19 | <-- new interval fills gap
| 20 | 24 |
+-------+-----+

问题

问题是,如何将其作为事务来实现。具体来说,我想阻止任何其他线程/进程在我正在操作的时间间隔内的任何间隙中创建新的 TimeSlot。性能不是问题,因为并发用户数非常低。我正在寻找实现起来最简单的解决方案。

在普通 JDBC 中,我会使用事务隔离级别 SERIALIZABLE,但在 JPA 中没有设置隔离级别的标准方法。我正在寻找一种不依赖于供应商特定功能的解决方案。

或者,如果提交失败,我可以只使用乐观锁定并重试,但这需要额外的错误处理逻辑。

是否有任何可行的替代方案,或者乐观锁定/失败重试是否是 JPA 中的方法?

最佳答案

我不清楚你想做什么,也许解释得更好。您要防止出现哪种特定 SQL?

您似乎试图避免并发插入,这是锁定或可序列化事务隔离对您没有帮助的事情,行锁定只能防止对同一行的并发更新/删除。

主键或唯一约束应该足以防止两个事务插入具有相同开始日期的时间段。

看, http://en.wikibooks.org/wiki/Java_Persistence/Locking

关于java - 如何使用 JPA 以并发安全的方式获取非重叠日期范围中的间隙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12689652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com