我正在使用Spring“@Transactional”Annotation来处理交易。
@Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED,rollbackFor=SQLException.class)
public void updateBatch(Report a)
throws SQLException, DataAccessException { insert1();insert2(); insert3(); }
但是以防万一
这些插入是ibatis inbuild函数,用于触发DB中的插入 我得到了以下异常
"Caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:717) 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.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)"
并且事务不会回滚,即insert1(),insert2()不会回滚
请让我知道我错过了什么
答案 0 :(得分:2)
你在insert1和insert2做什么?
他们是否使用具有PROPAGATION.REQUIRES_NEW
属性的其他交易?如果是,他们将不会回滚。否则你会在insert1或insert2中回滚吗?
我遇到了同样的问题。虽然它可能与你所拥有的有点不同。我所拥有的是你有两个服务A和B的情况。
A在try-catch块中调用B的方法。 B抛出RuntimeException,A的catch块将该异常包装到catched异常中。
我的情景发生了什么: - B是交易代理背后的独立类 - B抛出运行时异常,将事务设置为回滚 - 因为我有Propagation.REQUIERED,它与A的方法相同 - 包装异常并抛出它,因为异常既不是RuntimeException也不是Error,提示方法不会进入transactionManager.rollback而是进入transactionManager.commit - 这将抛出UnexpectedRollback,因为事务先前已标记为回滚。
您的情况可能有所不同。