Я все еще в стадии обучения с весенними транзакциями и aop, и у меня есть некоторые недоразумения:
1. Если я не использую, имейте консультацию aop и я указываю для каждой службы что-то вроде:
Весенние транзакции и AOP
@Transactional (rollbackFor = java.lang.Exception.class, доступен только для чтения = истина)
, а затем я смотрю на весну журнал кажется, что все работает, как ожидалось. Я имею в виду, что транзакция создается, и в случае исключения я получаю откат. Но если и использовать что-то вроде:
<bean id="txManagerVA" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emfVA" />
</bean>
<tx:annotation-driven transaction-manager="txManagerVA" />
<aop:config>
<aop:pointcut id="transactionalServiceMethodsVA" expression="execution(* xxx.services.vs.*.*(..))"/>
<aop:advisor advice-ref="txManagerVAAdvice" pointcut-ref="transactionalServiceMethodsVA"/>
</aop:config>
<tx:advice id="txManagerVAAdvice" transaction-manager="txManagerVA">
<tx:attributes>
<tx:method name="get*" rollback-for="java.lang.Exception" read-only="true"/>
<tx:method name="*" rollback-for="java.lang.Exception" />
</tx:attributes>
</tx:advice>
Итак, когда я смотрю на весенний журнал, используя этот сценарий, кажется, что есть 2 сделки, внутри другой, потому что после отката я получить что-то вроде:
(IntermedServiceImpl.java:45) - WE HAVE AN EXCEPTION !!!! nullCrocodilu
(TransactionAspectSupport.java:406) - Completing transaction for [xxx.IntermedServiceImpl.getIntermed] after exception: java.lang.Exception: Crocodilu
(RuleBasedTransactionAttribute.java:130) - Applying rules to determine whether transaction should rollback on java.lang.Exception: Crocodilu
(RuleBasedTransactionAttribute.java:147) - Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.Exception]
(AbstractPlatformTransactionManager.java:935) - Triggering beforeCompletion synchronization
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.Ex[email protected]63fd1f47] for key [[email protected]] from thread [thread-pool-1-8080(6)]
(AbstractPlatformTransactionManager.java:843) - Initiating transaction rollback
//SO FAR SO GOOD
(JpaTransactionManager.java:533) - Rolling back JPA transaction on EntityManager [[email protected]]
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]7ed30037] from thread [thread-pool-1-8080(6)]
(JpaTransactionManager.java:593) - Closing JPA EntityManager [[email protected]] after transaction
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager
--> (AbstractPlatformTransactionManager.java:1012) - Resuming suspended transaction after completion of inner transaction <--
(TransactionSynchronizationManager.java:272) - Initializing transaction synchronization
(TransactionAspectSupport.java:406) - Completing transaction for [xxx.IntermedServiceImpl.getIntermed] after exception: java.lang.Exception: Crocodilu
(RuleBasedTransactionAttribute.java:130) - Applying rules to determine whether transaction should rollback on java.lang.Exception: Crocodilu
(RuleBasedTransactionAttribute.java:147) - Winning rollback rule is: null
(RuleBasedTransactionAttribute.java:152) - No relevant rollback rule found: applying default rules
(AbstractPlatformTransactionManager.java:922) - Triggering beforeCommit synchronization
(AbstractPlatformTransactionManager.java:935) - Triggering beforeCompletion synchronization
(AbstractPlatformTransactionManager.java:752) - Initiating transaction commit
(JpaTransactionManager.java:507) - Committing JPA transaction on EntityManager [[email protected]]
(AbstractPlatformTransactionManager.java:948) - Triggering afterCommit synchronization
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]6012b597] from thread [thread-pool-1-8080(6)]
(JpaTransactionManager.java:593) - Closing JPA EntityManager [[email protected]] after transaction
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager
как вы можете видеть там, я отметил строку, которую я не понимаю.
И второй вопрос: в том же файле журнала I`ve заметил строку:
(JpaTransactionManager.java:407) - Not exposing JPA transaction [[email protected]] as JDBC transaction because JpaDialect [[email protected]] does not support JDBC Connection retrieval
и я гугле немного и после того, как добавили:
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</bean>
</property>
entitymanager bean, теперь кажется, что jpa выставляет транзакцию транзакции jdbc. Проблема в том, что я не знаю, какие преимущества/недостатки этой конфигурации.