@事务回滚在 Spring Boot 应用程序中不起作用?

Pra*_*oli 0 java spring spring-data spring-data-jpa spring-boot

我有一个要求,我需要将一些员工数据插入 db2 数据库,下面是代码:

@Log4j2
@Service
@Transactional
public class EmployeeServiceImpl extends EmployeeService{

@Autowired
private EmployeeDataRepository employeeDataRepository;

@Override
@Transactional(rollbackOn = {DataAccessException.class})
public void insertEmployeeData(List<Employee> employeeList){
 try{
     employeeDataRepository.insertEmployeeData(employeeList);
    }catch(DataAccessException ex){
      log.error("Exception whie inserting data in db {}",ex.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)
@Log4j2
@Repository
public class EmployeeDataRepositoryImpl implements EmployeeDataRepository{

@Autowired
private DataSource dataSource;

@Value("${db.schema}")
private String schema;

@Override
public void insertEmployeeData(List<Employee> employeeList){
   this.jdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("Employee");
   for(Employee emp : employeeList){
    Map<String,Object> parameters = new HashMap<String,Object>();
      parameters.put("name", emp.name);
      parameters.put("age", emp.age);
      parameters.put("dateOfJoining", emp.dateOfJoining);
      parameters.put("address", emp.address);
      parameters.put("salary", emp.salary);
      jdbcInsert.execute(parameters);
      log.info("Created Record Name = " + name + " Age = " + age + " dateOfJoining = "+dateOfJoining);
      }
      return;
}

} 
Run Code Online (Sandbox Code Playgroud)

使用 spring 数据源属性配置数据源并将其注入到EmployeeDataRepositoryImpl类中。我正在使用SimpleJdbcInsert将数据插入 db2 表。对于跨国处理,我使用 @Transactional(rollbackOn = {DataAccessException.class})on 方法。当数据被一一插入时,如果数据库级别出现问题,那么它应该回滚,但最终不会发生。我也尝试在类级别添加注释,但没有运气。如果我遗漏了什么,请告诉我?

mar*_*rco 5

你在这里混淆了一些事情。

  1. 如果(运行时)异常通过您的 @Transactional 方法冒泡,Spring 会回滚您的事务。
  2. 您正在捕获 DataAccessException 异常,从而防止回滚。
  3. 也不需要在rollbackOn中指定异常。

你的代码应该是这样的,这就足够了。

@Transactional
public void insertEmployeeData(List<Employee> employeeList){
  employeeDataRepository.insertEmployeeData(employeeList);
}
Run Code Online (Sandbox Code Playgroud)

有关 @Transactional 如何工作的更多信息,请参阅此链接。