Дублированный идентификатор: Java-пакеты запускаются одновременно и вставляются в одну таблицу (последовательность не соблюдается) - PullRequest
0 голосов
/ 02 мая 2019

У меня есть две разные партии (B1 и B2), работающие одновременно. У каждого пакета есть транзакционный сервис, который выполняет обновление для одной и той же таблицы.

Во-первых, в PostGreSQL объявлена ​​последовательность:

CREATE SEQUENCE mySeq
  MINVALUE 0
  MAXVALUE 99999999999
  START WITH 1
  INCREMENT BY 50
  CACHE value;

И мой сущностный бин ссылается на эту последовательность, как показано ниже:

 @Entity
 public class MyBean{

    @GeneratedValue(generator = "SEC_ID", strategy =GenerationType.SEQUENCE)
    @SequenceGenerator(name = "SEC_ID", sequenceName ="mySeq",allocationSize=50)
    private long id;
 }     

А транзакционная служба делает вставку в таблицу:

@Service
@Transactional
public class MyService{
      @Autowired
      private MyDao myDao
      .....

      public void insertIntoDB(List<MyBean> beans){
         for(MyBean bean : beans){
             myDao.saveOrUpdate(bean);
         }
      }
}

Сценарий выполнения:

Напомним, что пакеты B1 и B2 запускаются одновременно на сервере jboss, как показано ниже:

a) Пакет B1 вставляет вхождения в таблицу A со значением id от 0 до 100 (начиная с момента T1 и заканчивая на T2).

b) Пакет B2 вставляет вхождения в таблицу A со значением id от 150 до 190 (150 из-за приращения, определенного в последовательности) (начиная с момента времени T2 и заканчивая с момента времени T3).

c) Пакет B1 вставляет вхождения в таблицу A со значением id от 101 до 130 (начиная с момента T3 и заканчивая на T4).

При втором запуске пакета B1 (начиная с момента времени T3) идентификатор таблицы начинается с 101, а не с 191.

Как мне поступить, чтобы при втором прогоне партии B1 после прохождения партии B2 идентификатор равнялся 191?

Заранее благодарим за ваш ответ.

...