Sreekanth
Sreekanth

Reputation: 539

Entity getting saved without @Transactional

We are facing a some issue related to spring @Transactional, we have a controller and a service class, though the service class is not marked with @Transactional, entity is getting saved. We are using @EnableTransactionManagement(proxyTargetClass = true) and OpenEntityManagerInViewInterceptor also spring data JPA. I guess this info may not be sufficient but any insight on what could be the possible reasons for this behavior. Few logs before entity persistence

2016-01-07 20:58:15,393 DEBUG [org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource] (default task-23)  Adding transactional method 'save' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2016-01-07 20:58:15,393 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (default task-23)  Creating new transaction with name [org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2016-01-07 20:58:15,394 DEBUG org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl] (default task-23)  Skipping JTA sync registration due to auto join checking
2016-01-07 20:58:15,394 DEBUG [org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl] (default task-23)  Skipping JTA sync registration due to auto join checking
2016-01-07 20:58:15,394 DEBUG [org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl] (default task-23)  successfully registered Synchronization
2016-01-07 20:58:15,394 DEBUG [org.hibernate.jpa.spi.AbstractEntityManagerImpl] (default task-23)  Looking for a JTA transaction to join
2016-01-07 20:58:15,394 DEBUG org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler] (default task-23)  Joined JTA transaction
2016-01-07 20:58:15,394 DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory] (default task-23)  Returning cached instance of singleton bean 'jpaAuditingHandler'
2016-01-07 20:58:15,417 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (smsQueueListenerBean-1)   Initiating transaction commit
2016-01-07 20:58:15,417 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (smsQueueListenerBean-1)   Creating new transaction with name [smsQueueListenerBean]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2016-01-07 20:58:15,418 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (emailQueueListenerBean-1)   Initiating transaction commit
2016-01-07 20:58:15,418 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (emailQueueListenerBean-1)   Creating new transaction with name [emailQueueListenerBean]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2016-01-07 20:58:15,459 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (default task-23)  Participating in existing transaction
2016-01-07 20:58:15,459 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (default task-23)  Participating in existing transaction
2016-01-07 20:58:15,460 DEBUG [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] (default task-23)  Obtaining JDBC connection
2016-01-07 20:58:15,461 DEBUG [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] (default task-23)  Obtained JDBC connection
2016-01-07 20:58:15,463 DEBUG [org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl] (default task-23)  Starting ResultSet row #0
2016-01-07 20:58:15,463 DEBUG [org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl] (default task-23)  On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified
2016-01-07 20:58:15,464 DEBUG [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] (default task-23)  Releasing JDBC connection
2016-01-07 20:58:15,465 DEBUG [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] (default task-23)  Released JDBC connection

Upvotes: 0

Views: 2652

Answers (1)

Zava
Zava

Reputation: 400

To sum up what we discussed in the comments: SimpleJpaRepository is the default implementation of JpaRepository interface. If we look at this implementation, we can see that, by default, we are using a read-only transaction (for methods like findAll, ...), and for deleting or saving services, they are annotated with @transactional. QEF.

Upvotes: 4

Related Questions