Java 使用Hibernate、PostgreSQL和Quartz的并发事务

Java 使用Hibernate、PostgreSQL和Quartz的并发事务,java,spring,hibernate,postgresql,quartz-scheduler,Java,Spring,Hibernate,Postgresql,Quartz Scheduler,因此,我使用Hibernate、Spring、PostgreSQL和Quartz Quartz my在多个线程中有许多并发作业,因此每个作业都会向DB插入一些数据并在事务中执行。每一行都有一个序列属性,该属性来自DB序列 我需要一个奇怪的东西-所有行,插入到一个作业中,所以在一个事务中,必须按顺序从1,2,3到第一个并发事务,只有4,5,6到第二个事务 我知道,如果我们有两个或两个以上的并发事务-它们可能会混合使用数字 如何解决这个问题?那么您可能必须以编程方式处理序列生成。另一种方法是使用序列

因此,我使用Hibernate、Spring、PostgreSQL和Quartz

Quartz my在多个线程中有许多并发作业,因此每个作业都会向DB插入一些数据并在事务中执行。每一行都有一个序列属性,该属性来自DB序列

我需要一个奇怪的东西-所有行,插入到一个作业中,所以在一个事务中,必须按顺序从1,2,3到第一个并发事务,只有4,5,6到第二个事务

我知道,如果我们有两个或两个以上的并发事务-它们可能会混合使用数字


如何解决这个问题?

那么您可能必须以编程方式处理序列生成。另一种方法是使用序列表

CREATE SEQUENCE my_sequence INCREMENT BY 3
或者任何对你有用的东西。然后为您的密钥选择该值,并在事务中递增1

或者,您可以使用获取特定于每个线程的值

 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为每个线程获取下一个值,而不用担心每个线程是否获得不同的值。

分配序列的是什么?如果数据库分配它,它不就是按照它接收请求的顺序分配序列吗,这就是您想要的吗?正如我所知,来自两个并发事务的插入可能是混合的,所以第一个事务可能分配1,4,5,第二个事务可能分配-2,3,6。我不希望这样。您可以锁定表以避免并发,但您的应用程序将变得慢得多。但是你为什么关心这些数字呢?在回滚之后,您的序列将不会回滚,并且您最终会在数字中喋喋不休。这个数字有多重要,它是什么意思?我想你需要使用