2016-09-13 4 views
0

Я пытаюсь использовать декларативную транзакцию вокруг метода в моем приложении, который вызывает несколько запросов к базе данных. Я сделал это путем применения @Transactional аннотацию к методу в вопросе, который выглядит что-то похожее на это:Spring - Транзакция не применяется вокруг метода

@Transactional 
public MyReturnType myTransactionalMethod(SomeType1 param) { 
    SomeType2 someIntermediateObject = dao1.doStuff(param); 
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject); 
    return retObj; 
} 

Я тогда установить пружинные транзакции в моем XML конфигурации:

<tx:annotation-driven transaction-manager="transactionManager" order="200"/> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
     p:dataSource-ref="dataSource"/> 

Я тогда хотел чтобы проверить этот метод, чтобы проверить, что сделки будут правильно откатить на провал в методе, так что я изменил мой метод, чтобы выглядеть примерно так:

public MyReturnType myTransactionalMethod(SomeType1 param) { 
    SomeType2 someIntermediateObject = dao1.doStuff(param); 
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject); 
    throw new RuntimeException(); //The RuntimeException should trigger a rollback 
} 

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

Может ли кто-нибудь увидеть что-нибудь, что я делаю неправильно, что приведет к такому поведению, когда обработка транзакций не будет применена?

+3

Показать, где вы звоните 'myTransactionalMethod'. – chrylis

ответ

1

Такое поведение связано с тем, что вы используете DataSourceTransactionManager, этот txManager используется для транзакций JDBC. Например, если вы вставляете что-то в базу данных, и это не удается, он откатит эту транзакцию. Tx может выйти из строя, если вы попытаетесь вставить значение дольше, чем разрешено. Обратите внимание, что источник данных знает об ошибке.

В вашем примере DataSource не знает об ошибке, поскольку вы выбрасываете исключение. Для этих случаев вы можете использовать JtaTransactionManager, но ваш контейнер должен поддерживать транзакции JTA. Или вы можете сделать сбой в базе данных, пытаясь вставить какое-то значение слишком долго или значение другого типа или нулевое значение в столбце, отличном от нуля.

Вы можете увидеть здесь:

http://www.journaldev.com/2603/spring-transaction-management-jdbc-example

http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

Смежные вопросы