当前位置: 首页 > 知识库问答 >
问题:

Spring Hibernate事务回滚不工作

岳飞航
2023-03-14
package com.yetistep.dboy.business.impl;
@Service
@Transactional
public class TestServiceImpl implements TestService {
    @Autowired
    TestDaoService testDao;

    @Autowired
    CustomerDaoService customerService;

    @Override
    @Transactional //I supposed propagation control from aop config 
    public Boolean saveMulTransactions(User user, Customer customer) throws Exception {
        testDao.saveUser(user);

        customerService.saveCustomer(customer);

        return true;
    }
}  
public class TestDaoServiceImpl implements TestDaoService {
    @Autowired
    SessionFactory sessionFactory;
    Session session = null;
    Transaction tx = null;

    @Override
    public boolean saveUser(User user) throws Exception {
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        session.save(user);
        tx.commit();
        session.close();
        return false;
    }
}
public class CustomerDaoServiceImpl implements CustomerDaoService{
    @Autowired
    SessionFactory sessionFactory;
    Session session = null;
    Transaction tx = null;
    @Override
    public boolean saveCustomer(Customer customer) throws Exception {
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        session.save(customer);
        tx.commit();
        session.close();
        return false;
    }
}  
public @ResponseBody
    ServiceResponse createAdmin(@RequestBody User user) throws Exception{
        log.debug("Saving User to Database");

        ServiceResponse serviceResponse = null;
        try {
            Customer customer = new Customer();
            customer.setName("Jeka");
            customer.setContact("87897898788978979");
            customer.setContact("Ktm");

            testService.saveMulTransactions(user, customer);
            serviceResponse = new ServiceResponse("User Added Successfully!!!");

        } catch (Exception e) {
            e.printStackTrace();
        }
        return serviceResponse;
    }  
<tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- MUST have transaction manager, using aop and aspects  -->
    <bean id="transactionManager"
          class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true" />
            <tx:method name="find*" read-only="true" />
            <tx:method name="*" propagation="REQUIRED" rollback-for="Throwable"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="userServicePointCut"
                      expression="execution(* com.yetistep.dboy.business.impl.*ServiceImpl.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointCut" />
    </aop:config>  

共有1个答案

艾学海
2023-03-14

为什么它要回滚...您自己打开新会话,也自己管理事务。Spring怎么会知道。

你的daos在很多方面都是错误的。

  1. 永远不要将会话/事务存储在实例变量中
  2. 使用Spring管理事务时,请不要使用OpenSession
  3. 如果需要容器管理事务,请不要管理自己的事务。
public class CustomerDaoServiceImpl implements CustomerDaoService{
    @Autowired
    SessionFactory sessionFactory;

    @Override
    public boolean saveCustomer(Customer customer) throws Exception {
        Session session = sessionFactory.getCurrentSession();
        session.save(customer);
        return false;
    }
}  
 类似资料:
  • 在我的一般问题之后,我有一个使用Spring的特定问题,我想在下面每次执行DAO方法后回滚特定的测试方法。 添加和未能回滚插入 此外,在之前/之后获取连接并回滚也不会产生影响 我应该如何使用TestNG框架回滚单元测试?大多数答案使用JUnit的 我未能使用TestNG自动接线: 但是成功地使用了和include配置类includes jdbcTemplate/DataStource TestNG

  • 我在Spring Boot应用程序中有一个Javers实现。Mongo4.4被用作数据库。从MongoDB4.4开始,您可以在事务中创建文档。 我在创建对象时模拟了一个异常。如预期的那样,对象没有在数据库中创建,但是一个新的快照被添加到jv_snapshots集合中。 控制器:

  • 我有一个应用程序,它使用spring 4 . 0 . 1 JPA hiba Nate 4 . 2 . 8(spring的JpaTransactionManager,localcontainereentitymanagerfactorybean,带有HibernateJpaDialect和apache的BasicDataSource作为数据源)进行数据库访问。在某个时刻,应用程序开始一个长时间运行的

  • 我需要在事务成功或回滚后调用一些方法。我使用as 应用程序使用一些外部web服务,当内部事务回滚时,这些服务需要“清理”。有没有一种方法可以在不使用声明性事务管理的情况下实现这一点。

  • 我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了

  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?