我正在尝试学习 Spring Data 的传播,并且了解到 Propagation.REQUIRES_NEW 始终使用全新的事务。当我尝试下面的代码时,findById 方法找到该记录,但该记录实际上并不保留在数据库中。
我预计调用 findById 将无法找到具有相关 id 和新事务的记录,因为 save 方法不会刷新数据。但就我而言,它找到了记录。怎么才能找到呢?
@Autowired
private DriverRepository driverRepository;
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void saveDriver(Long driverId, Driver driver) {
driverRepository.save(driver);
printDriver(driverId);
}
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public void printDriver(Long driverId) {
Optional<Driver> existingDriverAsOptional1 = driverRepository.findById(driverId);
Driver existingDriver1 = existingDriverAsOptional1.get();
System.out.println(existingDriver1.getDriverName());
System.out.println(existingDriver1.getDriverSurname());
System.out.println(existingDriver1.getDriverTeam());
}
在
Spring Data JPA
中,save方法不一定立即将更改刷新到数据库。默认情况下,更改会在事务结束时刷新。在您的例子中, saveDriver
方法用 @Transactional(propagation = Propagation.REQUIRES_NEW)
进行注释,这意味着为此方法启动了一个新事务。
但是,save 方法本身可能不会立即将更改刷新到数据库。如果 save 方法仅将实体标记为持久化(即,将其放入持久化上下文中),并且实际的数据库写入被推迟到事务结束,则意味着
printDriver
方法仍然可以看到更改,因为它在同一笔交易中。