Откат транзакций для проверенных и непроверенных исключений - PullRequest
0 голосов
/ 05 ноября 2011

Я использую Spring JDBC Template вместе с PostgreSQL.Ниже моя конфигурация Настройки источника данных и транзакций:

<bean id="databasePropertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/config/database.properties" />

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${database.driverClassName}"
          p:url="${database.url}"
          p:username="${database.username}"
          p:password="${database.password}" />

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="txManager" />

На моем бизнес-уровне я делаю следующее:

@Transactional(rollbackFor=Exception.class)
@RequiresPermissions("hc:patient_createInvoice")
public Long createInvoice(Invoice invoice, List<InvoiceItem> items) throws ValidationException, NetAmountMismatchException, PatientInvoiceException
{
       try{
            dao1.insert(invoice);
       }
       catch(DataAccessException x){
            throw new PatientInvoiceException(x);
       }

       try{
            somevalidation(invoiceItem);    // Causes validation exception
            dao2.insert(invoiceItems);
       }
       catch(DataAccessException x){
       throw new PatientInvoiceException(x);
   }
}

Что-то в этом роделюбое исключение (проверено или не проверено) выбрасывается из этого метода, все обновления базы данных, выполненные до сих пор, должны быть отменены.

Это не происходит с текущим кодом.

Чего мне не хватаетна самом деле?

1 Ответ

2 голосов
/ 07 ноября 2011

По умолчанию Spring откатывает транзакции только для непроверенных исключений. Из справочника Spring :

Код инфраструктуры транзакций Spring Framework помечает транзакцию для отката только в случае выполнения, непроверенных исключений; [...] Проверенные исключения, генерируемые транзакционным методом, не приводят к откату в конфигурации по умолчанию.

Однако вы можете настроить Spring на откат и для проверенных исключений, например ::

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="*" rollback-for="ValidationException, NetAmountMismatchException, PatientInvoiceException" />
    </tx:attributes>
</tx:advice>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...