【发布时间】:2014-04-04 11:49:11
【问题描述】:
@Override
@Transactional(rollbackFor = { RuntimeException.class, Exception.class}, propagation = Propagation.REQUIRED)
public String upload(ObjectVO vo) throws CustomException {
.......
}
在此服务中,我将插入两个表。如果在处理应该在第一个表之后插入的第二个表的数据(如强制字段检查)时出现异常,是否应该回滚在同一事务中插入第一个表中的数据?就我而言,我没有让它回滚。预期的行为是什么? (是的,我没有捕捉到异常,它是一个自定义异常,包含在rollbackFor 子句中,并且正在被抛出)
(I am using hibernate)
DAO 层执行getSession().save(entity);(getSession() 返回 currentSession)
(所以第一个表中的数据仍然存在)
这些表不相关。
<tx:annotation-driven/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
lazy-init="true">
<property name="dataSource" ref="dataSource" />
</bean>
【问题讨论】:
-
你确定是Spring管理的Service实例吗?
-
我假设您的 customException 是checkedException。如果它是 CustomException ,如果你没有明确地被捕获,它应该是方法签名的一部分(作为 throw ) - 我在哪里错了吗?
-
是的。 sory 是一个错字。固定
-
与您的问题无关,但这里有些多余
rollbackFor = { RuntimeException.class, Exception.class, CustomException.class }您的 CustomException 是运行时或已检查(异常子类)异常,实际上您甚至可以将所有内容替换为rollbackFor = { Throwable.class} -
首先,使用 log4j 启用日志记录并将级别设置为调试或跟踪:Spring 类将输出显示事务创建等的详细日志记录。如果您看不到显示正在创建的事务的日志记录输出,那么您有一些东西配置错误。如果它存在并且没有回滚,那么是代码问题。
标签: java spring hibernate transactions spring-transactions