Elasticsearch 和 Spring Data(乐观锁定)

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

我对通过弹性 Spring Boot 数据进行一些自动化实现有疑问。

@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "super_test_index")
public class TestIndex {

    @Field(type = FieldType.Keyword)
    private String id;

    @Field(type = FieldType.Text)
    private String text;

    @CreatedDate
    private Instant createDate;

    @LastModifiedDate
    private Instant updateDate;

    @Version
    private Long indexVersion;
}

添加了存储库

@Repository
public interface TestRepository extends ElasticsearchRepository<TestIndex, String> {
}

并实现了简单的代码

@Service
@RequiredArgsConstructor
public class TestService {

    private final TestRepository testRepository;


    public TestIndex save() {
        TestIndex testIndex = TestIndex.builder()
                .id(UUID.randomUUID().toString())
                .text("test")
                .build();
        return testRepository.save(testIndex);
    }

    public TestIndex update(String id, String text) {
        TestIndex testIndex = testRepository.findById(id).orElseThrow();
        testIndex.setText(text);
        return testRepository.save(testIndex);
    }

}

并通过控制器调用它

@RestController
@RequiredArgsConstructor
public class TestController {

    private final TestService testService;


    @PostMapping("/api/test/save")
    public TestIndex save() {
        return testService.save();
    }

    @PostMapping("/api/test/update")
    public TestIndex update(@RequestParam("id") String id, @RequestParam("text") String text) {
        return testService.update(id, text);
    }

}

在创建时我得到了更新的文档

{
  "id": "9a16210a-3ab7-4d52-bcd2-ec87f46cc403",
  "text": "test",
  "createDate": null,
  "updateDate": null,
  "indexVersion": 1
}

但是更新它

  "exception": "Elasticsearch exception [type=version_conflict_engine_exception, reason=[9a16210a-3ab7-4d52-bcd2-ec87f46cc403]: version conflict, current version [1] is higher or equal to the one provided [1]]; nested exception is [super_test_index/e03tZCuoRzeJB2SpVQIefQ][[super_test_index][0]] ElasticsearchStatusException[Elasticsearch exception [type=version_conflict_engine_exception, reason=[9a16210a-3ab7-4d52-bcd2-ec87f46cc403]: version conflict, current version [1] is higher or equal to the one provided [1]]]"

收到错误消息。所以我有几个问题:

  1. 是否可以通过 Spring Data Elastic 配置乐观锁定?
  2. 如何配置字段的创建日期/更新日期,还是我必须手动执行?

我刚刚发现一些关于我必须配置版本控制(如“外部版本”)的信息,但我不知道如何通过 Spring Boot 来做到这一点。我对 jpa 存储库/实体做了同样的事情,但从未对弹性做过。

java elasticsearch spring-data-elasticsearch optimistic-locking
1个回答
0
投票

如何通过 Spring Boot 来做到这一点

Spring Data Elasticsearch 不是 Spring Boot。

索引的版本管理可以使用

versionType
注释的
@Document
属性来定义。

请注意,当前版本的 Elasticsearch 文档 (https://www.elastic.co/guide/en/elasticsearch/reference/8.11/optimistic-concurrency-control.html) 仅描述了使用 _seq_no 的乐观锁定和 _primary_term (Spring Data Elasticsearch 也支持)。使用版本字段是之前执行此操作的方法,您最好迁移。

还有一件事: 请使用

@Id
注释您的 id 属性,而不是依靠名称来检测它,您可以省略 id 字段上的
@Field
注释。

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