Tôi đang gặp sự cố khi thực hiện giao dịch trong phương thức @Transactional của mình:
methodA() {
methodB()
}
@Transactional
methodB() {
...
em.persist();
...
em.flush();
log("OK");
}
Khi tôi gọi methodB () từ methodA (), phương thức sẽ chuyển thành công và tôi có thể thấy "OK" trong nhật ký của mình. Nhưng sau đó tôi nhận được
Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at methodA()...
- Bối cảnh của methodB hoàn toàn bị thiếu trong trường hợp ngoại lệ - tôi cho là ổn chứ?
- Một cái gì đó trong methodB () đã đánh dấu giao dịch là chỉ khôi phục? Làm thế nào tôi có thể tìm ra nó? Chẳng hạn, có cách nào để kiểm tra một cái gì đó như thế này không
getCurrentTransaction().isRollbackOnly()?
- như thế này, tôi có thể xem qua phương pháp và tìm nguyên nhân.