java - spring jpa crud 存储库在多线程环境中从数据库获取旧数据

标签 java spring-boot jpa spring-data-jpa spring-kafka

我正在使用 mysql 数据库和 kafka 作为消息传递服务运行 spring boot 应用程序(使用 kafka 和 mysql 的 chainedKafkaTransactionManager 进行事务同步)以进行一些异步操作。

当多个消息到达kafka监听器时,旧数据来自数据库而不是之前提交的数据。

我正在使用 CRUD 存储库,而且这种情况仅同时发生在多条消息上

示例: 更新一个具有姓名和 ID 的对象 PERSON;

第一条消息将通过 id 获取对象并将名称更新为 SAM。

第二条消息将获取对象并将名称更新为 REGO

第三条消息将获取该对象,然后如果我检查数据,它包含 SAM 作为名称,但在数据库中它具有 REGO。

我尝试添加隔离属性作为事务中提交的读操作,但没有成功

// listeners  

@Autowired
private PersonRepository personRepository;

@Autowired
private AddressRepository addressRepository;     

@KafkaListener(id = "update_name", topics = "update_name")
@Transactional(readOnly = false)
public void updateName(PersonModel personModel) {
    Person person = personRepository.findById(personModel.getId());   
    log.info("before -> name which is in database : " + person.getName());
    person.setName(personModel.getName());
    person = personRepository.save(person);
    log.info("after-> name which is in database : " + person.getName());
}

@KafkaListener(id = "update_name_and_address", topics = "update_name_and_address")
@Transactional(readOnly = false)
public void updateNameAndAddress(PersonModel personModel) {
    Address addr= addressRepository.findById(personModel.getAddresId);    
    addr.setPlace(personModel.getPlace());
    addressRepository.save(addr);

    updateName(personModel);
}

// repository
public interface PersonRepository extends CrudRepository<Person , Integer> {

}

我需要数据库中的最新数据

最佳答案

当第三个事务在第二个事务提交之前开始时,就会发生这种情况。 效果变得更加明显,因为一旦在 session 中加载实体,JPA 就不会重新加载实体。

为了尽量减少这个问题,请让您的交易尽可能短。 还要确保您可以通过在新事务中重试来处理乐观锁定异常。

关于java - spring jpa crud 存储库在多线程环境中从数据库获取旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56974486/

相关文章:

java - 如何使用 JSP 和 servlet 创建类似 google 的即时搜索?

java - com.sun.jersey.api.client.ClientHandlerException : java.net.ConnectException:连接被拒绝:在 Spring Boot 中连接

java - 将 transient 属性映射到别名 - Spring JPA

java - Android 中的 OpenCV 模板匹配示例

java - 如何启动、暂停和恢复我的线程? (通过从类扩展线程)

java - 难以通过 REST 上传文件

java - Datanucleus type_converter 插件

java - GenerationType.TABLE : Big numbers in the data base

java - 如何优化 REST API 调用

java - 线程 "main"中的异常 org.springframework.jdbc.CannotGetJdbcConnectionException