Исключение транзакции откатилось после обновления весны 1.2 до весны 4.3.9 - PullRequest
0 голосов
/ 29 января 2019

Мы обновили весеннюю версию до 4.3.9, и после обновления мы получаем исключение отката транзакции

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:125)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy65.bulkDeleteAreas(Unknown Source)
at com.nis.compass.test.functional.geocoding.GeocodingManagerTestHelper.bulkDeleteAreas(GeocodingManagerTestHelper.java:188)

здесь представлена ​​конфигурация xml для bean-компонента и родительского bean-компонентаactionProxy.Мы ничего не изменили в xml, но все равно он вызывает исключение транзакции.

  <bean id="geocodingManager" parent="baseTransactionProxy">
<property name="target">
  <bean class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.nis.compass.geocoding.service.GeocodingManagerInternal</value>
    </property>
    <property name="target" ref="geocodingManagerImpl" />
    <!-- list of interceptors, "Advice"s, and Advisors to add to the interceptor chain -->
    <property name="interceptorNames">
      <list>
        <value>performanceMonitorProxy</value>
      </list>
    </property>
  </bean>
</property>

  <bean id="baseTransactionProxy" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
  <ref local="compassTransactionManager" />
</property>
<property name="transactionAttributes">
  <props>
    <!-- Always propagate transaction, rolling back on any checked or unchecked exception -->
    <prop key="*">PROPAGATION_REQUIRED,-Throwable</prop>
  </props>
</property>
<property name="preInterceptors">
  <list>
    <bean class="com.nis.compass.common.interceptor.ExceptionTranslationInterceptor" />
  </list>
</property>

1 Ответ

0 голосов
/ 29 января 2019

Я думаю, что это просто улучшение в журнале между двумя версиями.Функциональное поведение, вероятно, такое же.

И это нормальное поведение, как указано в документации PROPAGATION_REQUIRED

Однако в случае, когда внутренняя область транзакцииустанавливает маркер только для отката, внешняя транзакция не определилась с самим откатом, и поэтому откат (тихо инициируемый областью внутренней транзакции) является неожиданным.Соответствующее UnexpectedRollbackException выбрасывается в этой точке. Это ожидаемое поведение, так что никогда нельзя ввести в заблуждение вызывающую транзакцию, предполагая, что фиксация была выполнена, когда она действительно не была .Таким образом, если внутренняя транзакция (о которой внешний вызывающий не знает) молча помечает транзакцию как только для отката, внешний вызывающий по-прежнему вызывает commit.Внешний вызывающий должен получить исключение UnexpectedRollbackException, чтобы четко указать, что вместо этого был выполнен откат.

Вы также можете прочитать этот связанный пост, в котором кратко изложено, что написано в документации: UnexpectedRollbackException: Транзакция отмененаназад, потому что он был помечен как только для отката

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...