问题
假设我有以下实体:
@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 中,我会使用 transaction-isolation-level SERIALIZABLE
,但是在 JPA 中没有设置隔离级别的标准方法。我正在寻找一种不依赖于供应商特定功能的解决方案。
或者,如果提交失败,我可以只使用乐观锁定并重试,但这需要额外的错误处理逻辑。
是否有任何可行的替代方案,或者是乐观锁定/重试失败的方式进入 JPA?