Метод весенней загрузки @Transactioanl, работающий в нескольких потоках - PullRequest
1 голос
/ 17 мая 2019

В моем приложении с весенней загрузкой я параллельно запускаю несколько потоков по методу @Transactioanl.

@Transactional
public void run(Customer customer) {

    Customer customer = this.clientCustomerService.findByCustomerName(customer.getname());
    if(customer == null) {
        this.clientCustomerService.save(customer);
    }

    // another database oparations
}

Когда это выполняется одновременно на нескольких потоках, так как объект клиента не будет сохранен доконец блока транзакций, есть ли возможность дублировать клиентов в базе данных?

1 Ответ

1 голос
/ 17 мая 2019

Если у вашего клиента есть поле @Id, которое определяет столбец первичного ключа в базе данных клиентов, база данных выдаст вам исключение, подобное javax.persistence.EntityExistsException. Даже если вы выполняете свой код в нескольких потоках, в определенный момент времени, возможно, на уровне базы данных, только одна из них получит блокировку для новой вставленной строки. Также вы должны определить @Version столбец / поле на верхнем уровне сущности, чтобы использовать оптимистическую блокировку. Подробнее об этом вы можете узнать здесь .

...