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

@transactional(rollbackfor={exception.class})不回滚事务

淳于健
2023-03-14

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

   @Service
   public class TestService {

      @Autowired
      TestRepository testRepository;

      @Transactional(rollbackFor={Exception.class})
      public void insertData(List<Data> dataList, Integer fkId)
         throws Exception {
         testRepository.updateData(dataList, fkId);
         //do some other stuff
      }
 }

testRepository.java

 @Respository
 public class TestRepository {

    @Autowired
    @Qualifier("dataJdbcTemplate")
    private NamedParameterJdbcTemplate dataJdbcTemplate;

    @Transactional(rollbackFor={Exception.class})
     public void updateData(List<Data> dataList, Integer fkId) 
        throws Exception {

         String deleteId = "DELETE FROM data where 
        fk_id = :fkId";

         dataJdbcTemplate.update(deleteId, new 
           MapSqlParameterSource("fkId", fkId));

         String sql = "INSERT INTO data(fk_id, column1, column2)"
            + " VALUES(:fkId, :column1, :column2)";

         SqlParameterSource[] batch = 
SqlParameterSourceUtils.createBatch(dataList.toArray());
    dataJdbcTemplate.batchUpdate(sql, batch);


 }

database.xml

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="dataJdbcTemplate" 
      class="org.springframework.jdbc.core.namedparam.
      NamedParameterJdbcTemplate">
      <constructor-arg ref="dataSource"/>
    </bean>

共有1个答案

史朗
2023-03-14

您应该尝试启用事务传播。

您可以在这里阅读更多内容:https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-propagation

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

  • 我有如下代码 ProcessTransactionInterral引发扩展RuntimeException的ServiceUnAvailableException 但是尽管有rollbackFor=exception.class,事务却没有回滚。你能帮帮我吗。

  • 我有一个eventhandler方法,它被注释为@Transactional,这个方法在同一个类中调用一个事件的实现。 此事件执行一些检查,根据结果,它将执行某些操作,或者更改状态并抛出RuntimeException。 status change方法在另一个类中,并且该方法用@transactional(propagation=propagation.requires_new)注释。 我预计,由

  • 我使用的是Spring Boot应用程序,在上面我试图实现事务性管理。但是Spring不会回滚用相同方法保存的数据。 代码库:https://github.com/vinothr/spring-boot-transactional-example

  • 在我开始这看似很长的一段之前,我想对我可能收到的任何建议/建议表示感谢。朱约翰 我开发了一个简单的测试来帮助我理解spring的声明性(@Transactional)事务管理框架如何与spring的RESTful web服务结合使用。 为此,我开发了以下RESTful控制器: 其中,“tester”是以下服务类的bean,并自动连接到此控制器。类中唯一的方法是事务性的: 在上面,GenericDB