java - 为什么 DataSourceTransactionManage 不回滚而 HibernateTransactionManager 回滚?

标签 java spring hibernate

<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/

相关文章:

java - Java中使用delete()方法删除文件

java - 我应该使用 Iterator 还是 for 循环来迭代?

java - 在 GWT 2.7 super 开发模式下调试,stackTrace 丢失?

java - hibernate的orderBy和Collections.sort()的区别

database - JPA 不从实体生成表

java - [ ][ ] 和 if 语句在代码中不起作用

java - 如何在 Activiti JavaDelegate 任务中访问 Spring Beans

spring - 如何 Autowiring Quartz JobListener

java - @Entity中的@Transactional不起作用?

mysql - 如何优化多表连接 View 以获得更快的响应?