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

Spring事务在@Transactional方法中的RuntimeException不回滚

罗金林
2023-03-14

我有这样的数据库配置:

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.mycompany")
public class DBConfiguration {

    @Bean(destroyMethod = "close")
    public javax.sql.DataSource dataSource() {
        DataSource ds = new DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost/v2");
        ds.setUsername("java");
        ds.setPassword("mypass");
        ds.setInitialSize(5);
        ds.setMaxActive(10);
        ds.setMaxIdle(5);
        ds.setMinIdle(2);
        ds.setRemoveAbandoned(true);
        ds.setLogAbandoned(true);
        return ds;
    }

    @Bean
    public DataSourceTransactionManager txManager()
    {
        DataSourceTransactionManager tx= new DataSourceTransactionManager(dataSource());
        return tx;
    }

}
@Service
public class FirstService {
    @Transactional  //<--- this annotation seems to be mandatory for my rollback but I don't want it.
    public void test() throws Exception{
        secondService.insert();
    }
}

@Service
public class SecondService {
    @Transactional //<-- I would like to have only this method in transaction
    protected void insert() throws Exception{
        dao.insertEntity(new Entity()); //<<--- this is an SQL insert command
        throw new RuntimeException("Rollback test");
    }
}
@RequestMapping("/test") @ResponseBody
    public void test() throws Exception{
        firstService.test();
    }
public void insertEntity(Entity e) {
        getJdbcTemplate().update(SQL_INSERT,e.getCode(),e.getName());       
    }

共有1个答案

虞滨海
2023-03-14

这对我很有效:

@Bean(name = "transactionManager")
    @Primary
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

请更新spring版本,也许更新一些日志或调试日志,看看事务是否有问题

 类似资料:
  • 我有一个事务性方法,我想调用另一个可能引发RuntimeException的方法。 问题是,当引发异常时,事务被标记为rollbackOnly。 编辑: 我不认为这是重复指定@Transactional rollbackFor也包括RuntimeException,因为异常最终会被捕获。 问题可能类似,因为它也涉及事务和回滚。

  • @Transactional标记是最近添加的。所以不确定它是否像预期的那样工作。 代码: 服务类别:

  • 问题内容: 使用Spring(3.0.5),Hibernate(3.6.0)和Wicket(1.4.14)开发应用程序时遇到了一个奇怪的问题。问题是:我无法将任何对象保存或修改到数据库中。“不能”是指对象的所有更改或对EntityManager.persist(foo)的调用都被简单,无声地忽略。选择工作。 示例案例很简单-在某些检票页面上,我尝试将对象保存到数据库中,如下所示 这是comicDA

  • 我在下面的代码中使用了Spring的@Transactional注释和JDBC模板,它不回滚事务。我使用了随机文件名和表名。我正在尝试删除外键id的行,然后在名为“data”的数据库表中插入相同id的记录。但是当我测试的时候,我发现如果插入中有错误,删除就不会被回滚。我对Spring还是个新手,如果有任何帮助,我将不胜感激。 testRepository.java database.xml

  • 我正在从非事务类try块(由另一个EJB类调用)调用事务方法a,该块将引发RuntimeException 然后在catch块中,事务方法b将处理exp。 令人惊讶的是,我必须用“REQUIRES\u NEW”注释方法B,否则程序将出现“Transaction is not active”异常。(stacktrace与此类似) 这是否是因为方法A的事务(标记为RuntimeException的回滚

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。