<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
lazy-init="true">
<property name="dataSource" ref="dataSource" />
</bean>
在使用 spring 和 hibernate 构建应用程序时,如果我使用 DataSourceTransactionManager
,则出现异常时,它不会回滚。似乎它在不同的 session 中使用自动提交。但是,如果我将事务管理器更改为 org.springframework.orm.hibernate3.HibernateTransactionManager
,回滚将按预期进行。
或者如果我们使用 hibernate ,那么我们需要使用 HibernateTransactionManager
吗?
注意:我的服务用 @Transactional(rollbackFor = { Throwable.class} )
注释
最佳答案
使用普通 hibernate 时,需要以下内容来管理事务
Session s = sessionfactory.openSession();
Transaction tx = null;
try {
tx = s.beginTransaction();
// Your data manipulation here
tx.commit();
} catch (Exception e) {
if (tx != null) { tx.rollback();}
} finally {
s.close();
}
这也是 HibernateTransactionManager
所做的(如果需要,打开一个 session ,开始事务,然后提交/回滚)。
现在您要做的是以下操作(这有点类似于 DataSourceTransactionManager
,它在 `DataSource 而不是 session 上运行。)
Session s = sessionfactory.openSession();
Connection conn = null;
try {
conn = s.connection();
// Your data manipulation here
conn.commit();
} catch (Exception e) {
if (conn != null) {
try {
conn.rollback();
catch (IOExceptin) {}
}
} finally {
s.close();
}
这不会起作用,因为实际的事务单元 session 永远不会收到提交或回滚的通知。因此,在最坏的情况下,根据您的刷新模式,所有(或部分)内容都会被提交。
简而言之,始终使用适合您技术的事务管理器。
当使用 plain hibernate 时使用 HibernateTransactionManager
,当使用 JPA 时使用 JpaTransactionManager
,在这些情况下不要使用 DataSourceTransactionManager
仅在使用仅普通 JDBC 的情况下可用。
DataSourceTransactionManager
明确指出它在 DataSource 和底层连接上运行。而当使用 Hibernate 时,事务由 hibernate Session
控制,这是 HibernateTransactionManager
所在的级别。操作。对于 JPA,这是 EntityManager
,这就是 JpaTransactionManager
的内容认识。
关于java - 为什么 DataSourceTransactionManage 不回滚而 HibernateTransactionManager 回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23865509/