Это может быть достигнуто путем поддержания транзакции на уровне нити. Однако для u потребуется общий объект между всеми этими потоками. Этот общий объект будет отслеживать статус всех этих потоков и уведомлять их об отказе. Если уведомление об отказе получено этими потоками, они сами могут выбросить исключение, и их транзакция будет отменена.
Примера код код в отдельных нитях
@Transactional(rollbackFor = Exception.class)
public void saveData(Product product, ProductStatusObject productStatusObject) throws Exception {
productDao.persist(product);
if(product.getId() == 5) {
productStatusObject.updateCounter(false);
} else {
productStatusObject.updateCounter(true);
}
if(!productStatusObject.getStatus()) {
throw new Exception();
}
}
Кодекса в общем классе частного конечный ИНТ totalThreads;
private int executedThreads = 0;
private Boolean finalStatus = true;
public ProductStatusObject(int totalThreads) {
this.totalThreads = totalThreads;
}
public synchronized void updateCounter(Boolean threadStatus) throws InterruptedException {
executedThreads ++;
if(!threadStatus) {
this.finalStatus = false;
}
if(totalThreads == executedThreads) {
notifyAll();
} else {
wait();
}
}
public synchronized Boolean getStatus() {
return finalStatus;
}
Здесь условие отказа - если какой-либо поток сохраняет данные с идентификатором 5, все потоки откатываются от их кода. Else все удастся
Возможный дубликат [Как использовать весеннюю транзакцию в многопоточном режиме] (http://stackoverflow.com/questions/10407301/how-to-use-spring-transaction-in-multithread) –
Я думаю, что это поможет вам. [Весеннее управление транзакциями по нескольким потокам] (https://dzone.com/articles/spring-transaction-management-over-multiple-thread-1) –