Transactionalpropagation = Propagation.REQUIRES_NEW没有在私有方法中打开新事务,而将相同的值作为参数传递

问题描述

我正在使用jpa实体列表器类where和spring数据存储库。在@PreMethod更新中,如果我使用@Transactional(propagation = Propagation.REQUIRES_NEW),则直接从数据库获取数据。如果我在called inside @PreMethod的私有方法 getoldEmployee )上使用相同的事务注释,则不是从数据库获取数据,而是使用相同的最新会话数据不确定为什么会发生这种情况

实体类

@Entity
@Table(name = "Employee")
@EntityListeners({EmployeeListener.class)
public class Employee extends AuditEntity implements Serializable {

}

监听器类

 @Component
 public class EmployeeListner{
 
 @Autowired
 EmployeeRepository employeeRepository;

  @PreUpdate
  @Transactional(propagation = Propagation.REQUIRES_NEW)   //if use here I get the employee database value before updating the database
  public void preUpdateEvent(Employee employee) {
    Employee employee=getoldEmployee(employee);
  }


  private Employee getoldEmployee(Employee employee) {     //if inspite of using  @Transactional(propagation = Propagation.REQUIRES_NEW) in @PreMethod if use here I am not getting the database value rather getting latest value
    Optional<Employee> getoldEmployeeOptional =employeeRepository.findById(employee.getId());
    getoldEmployeeOptional  
  }
}

解决方法

Spring仅在 public 方法上应用事务性设置,在其他情况下,这些设置将被忽略。
从Spring文档中:

使用代理时,应应用@Transactional批注 仅适用于具有公开可见性的方法。