4

问题

假设我有以下实体:

@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?

4

1 回答 1

0

我不清楚您要做什么,也许可以更好地解释。您要防止发生什么特定 SQL?

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

主键或唯一约束应该足以防止两个事务插入具有相同 startDate 的 TimeSlot。

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

于 2012-10-02T13:58:10.923 回答