使用Hibernate,PostgreSQL和Quartz的并发事务

时间:2014-05-24 16:05:15

标签: java spring hibernate postgresql quartz-scheduler

所以,我使用Hibernate,Spring,PostgreSQL和Quartz。

Quartz我在很多线程中有很多并发作业,所以每个作业都会将一些数据插入到DB中并在事务中执行。每行都有串行属性,它来自DB序列。

我需要一个奇怪的东西 - 插入一个作业的所有行(并且,因此在一个事务中)必须按序列中的数字顺序进行(例如," 1,2,3" - 到第一个并发交易,只有" 4,5,6"到第二个)。

我知道,如果我们有两个或更多的并发交易 - 它们可能会混合数字......

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可能必须以编程方式处理序列生成。在途中是使用序列表。

CREATE SEQUENCE my_sequence INCREMENT BY 3

或者任何适合你的东西。然后为您的密钥选择该密钥,并在您的事务中增加一个。

或者您可以使用ThreadLocal获取特定于每个主题的值。

 int seq = 1;

 private static final ThreadLocal<Integer> sequence = new ThreadLocal<Integer>() {
     @Override protected Integer initialValue() {
         return seq+=3;
     }
     @Override protected Integer get() {
         return seq+=3;
     }     
};

然后,您可以使用sequence.get()获取每个线程的下一个值,而不必担心每个线程是否获得不同的值。