Spring Data - 即使我使用propagation = Propagation.REQUIRES_NEW,findById也会找到未提交的数据

问题描述 投票:0回答:1

我正在尝试学习 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 spring-data
1个回答
0
投票

Spring Data JPA
中,save方法不一定立即将更改刷新到数据库。默认情况下,更改会在事务结束时刷新。在您的例子中,
saveDriver
方法用
@Transactional(propagation = Propagation.REQUIRES_NEW)
进行注释,这意味着为此方法启动了一个新事务。

但是,save 方法本身可能不会立即将更改刷新到数据库。如果 save 方法仅将实体标记为持久化(即,将其放入持久化上下文中),并且实际的数据库写入被推迟到事务结束,则意味着

printDriver
方法仍然可以看到更改,因为它在同一笔交易中。

© www.soinside.com 2019 - 2024. All rights reserved.