У меня есть сценарий, как показано ниже
methodA(){
try{
objB.methodB();
}
catch(Exception ex){
log(exception caught);
}
@Transactional(value = "txManager", propagation = Propagation.REQUIRES_NEW,rollbackFor={Exception.class, StaleObjectStateException.class})
methodB(){
methodC();
}
@Transactional(value = "txManager", propagation = Propagation.REQUIRED, rollbackFor = {Exception.class,StaleObjectStateException.class})
methodC(){
/*Some logic that throws HOLF/SOSE exception. Essentially calling merge on entity that has @Version enabled
}
Моя проблема в том, что для данного потока у меня может быть два запроса, вызывающих этот метод одновременно. Я ожидаю, что methodC выдаст исключение для сбоя оптимистической блокировки и откат транзакции.
Мое ожидание было:
Допустим, у меня есть два запроса R1 и R2 R1 и R2 вызывают методA -> methodB (запускает новую транзакцию) -> methodC (транзакция распространяется): оба читают одну и ту же версию объекта, оба вносят одинаковые изменения и вызывают слияние -> methodC завершает поток обратно to methodB -> methodB завершает принудительную фиксацию транзакции -> фиксация транзакции вызывает session.flush, получает исключение времени выполнения для оптимистической блокировки и откатывается.
Я получаю исключение SOSE в методе A, я вижу его в своих регистраторах, но транзакция зафиксирована, и обе записи сохраняются.
Происходит следующее: R1 и R2 вызывают methodA -> methodB (запускает новую транзакцию) -> methodC (транзакция распространяется): оба читают одну и ту же версию объекта, оба вносят одинаковые изменения и вызывают слияние -> methodC завершает поток обратно в methodB - > methodB завершает принудительную фиксацию транзакции -> транзакция фиксируется -> генерирует исключение времени выполнения для оптимистической блокировки НЕ откатывается, и исключение перехватывается методом methodA.
Если я явно выбрасываю исключение в methodC, транзакция откатывается.
Я не уверен, почему он не откатывает транзакцию, когда возникает исключение сбоя блокировки Optimisitc.
пожалуйста, порекомендуйте
methodC
, и мы сможем вам помочь. - person tsolakp   schedule 01.02.2018<aop>
конфигурация? Ваш компонент проксируется через интерфейс или через CGLib? - person M. Prokhorov   schedule 01.02.2018<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <qualifier value="txManager"/> </bean> <tx:annotation-driven transaction-manager="txManager" />
- person varkashy   schedule 01.02.2018