<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
lazy-init="true">
<property name="dataSource" ref="dataSource" />
</bean>
在使用spring和hibernate构建应用程序时,如果我使用
DataSourceTransactionManager
,则在例外情况下,它不会回滚。似乎它在不同的会话中使用自动提交。但是,如果我将事务管理器更改为org.springframework.orm.hibernate3.HibernateTransactionManager
,则回滚将按预期进行。还是如果我们使用hibernate,那么我们需要使用
HibernateTransactionManager
吗?N.b:我的服务带有
@Transactional(rollbackFor = { Throwable.class} )
注释 最佳答案
使用普通休眠时,需要以下各项来管理事务
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
的功能(如果需要,打开一个会话,开始事务,然后提交/回滚)。现在,您要执行的操作如下(对
DataSourceTransactionManager
有点类似,它在`DataSource而不是会话上运行)。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();
}
由于实际的事务单元(会话)永远不会收到有关提交或回滚的通知,因此无法正常工作。因此,在最坏的情况下,取决于刷新模式,所有(或部分)都将提交。
简而言之,请始终使用适合您技术的事务管理器。
在使用普通休眠模式时,使用
HibernateTransactionManager
,在使用JPA时使用JpaTransactionManager
,在这种情况下请勿使用DataSourceTransactionManager
,因为仅在仅使用普通JDBC的情况下才可用。DataSourceTransactionManager
明确声明它在DataSource和基础连接上运行。当使用Hibernate时,事务由休眠Session
控制,这是HibernateTransactionManager
进行操作的级别。对于JPA,这是EntityManager
,这是JpaTransactionManager
识别的。