簡體   English   中英

誇庫、兵變和反應性 postgresql 無回滾

[英]No rollback with quarkus, mutiny and reactive postgresql

我試圖在同一個事務中執行 3 個插入,但是當其中一個插入失敗時,我無法讓事務回滾。

我是響應式世界的新手,這是我的第一個響應式應用程序。

這是數據庫 model 的簡化:

EntityA 1---N EntityB
EntityA 1---N EntityC

我想在同一個事務中執行以下插入:

INSERT INTO A
INSERT INTO B  --(failing query)
INSERT INTO C

但是,當第二次插入失敗時,第一次插入不會回滾。

我有以下課程:

  • Processor :接收來自 kafka 的消息並通過服務觸發插入
  • Service :使用 3 個 DAO 運行 3 個插入
  • EntityADao : 運行實體 A 的插入
  • EntityBDao : 運行實體 B 的插入
  • EntityBDao : 運行實體 C 的插入
@ApplicationScoped
public class Processor {
    private final Service service;

    public Processor(final Service service) {
        this.service = service;
    }

    @Incoming("input-channel")
    @Outgoing("output-channel")
    public Uni<Message<RequestMessage>> process(final Message<RequestMessage> message) {
        final RequestMessage rm = message.getPayload();

        return service.saveEntities(rm)
                .onFailure()
                    .recoverWithItem(e -> {
                        final String errorMessage = "There was an unexpected error while saving entities";
                        LOG.error(errorMessage, e);

                        return Result.KO;
                    })
                .flatMap(result -> {
                    rm.setResult(result);

                    return Uni.createFrom()
                        .item(Message.of(rm), message::ack))
                });
    }
}
@ApplicationScoped
public class WorkerService {
    private final EntityADao entityADao;
    private final EntityBDao entityBDao;
    private final EntityCDao entityCDao;

    public WorkerService(final EntityADao entityADao,
                         final EntityBDao entityBDao,
                         final EntityCDao entityCDao) {
        this.entityADao = entityADao;
        this.entityBDao = entityBDao;
        this.entityCDao = entityCDao;
    }

    @Transactional(TxType.REQUIRED)
    public Uni<Result> saveEntities(final RequestMessage requestMessage) {
        return Uni.createFrom().item(Result.OK)
                // Save Entity A
                .flatMap(result -> {
                    LOG.debug("(1) Saving EntityA ...");

                    return entityADao.save(requestMessage.getEntityAData());
                })
                // Save Entity B
                .flatMap(result -> {
                    LOG.debug("(2) Saving EntityB ...");

                    return entityBDao.save(requestMessage.getEntityBData());
                })
                // Save Entity C
                .flatMap(result -> {
                    LOG.debug("(3) Saving EntityC ...");

                    return entityCDao.dao(requestMessage.getEntityCData());
                })
                // Return OK
                .flatMap(result -> Uni.createFrom().item(Result.OK));
    }
}
@ApplicationScoped
public class EntityADao {
    private final PgPool client;

    public EntityADao(final PgPool client) {
        this.client = client;
    }

    @Transactional(TxType.MANDATORY)
    public Uni<Result> save(final EntityAData entityAData) {
        return client
                .preparedQuery(
                        "INSERT INTO A(col1, col2, col3) " +
                            "VALUES ($1, $2, $3)")
                .execute(Tuple.of(entityAData.col1(), entityAData.col2(), entityAData.col3()))
                .flatMap(pgRowSet -> {
                    LOG.debug("Inserted EntityA!");

                    return Result.OK;
                });
    }
}

EntityBDaoEntityCDao類似於EntityADao

我已經將以下依賴項添加到pom.xml

  • quarkus-smallrye-context-propagation
  • quarkus-narayana-jta

為什么EntityBDao中的INSERT B查詢失敗,之前執行的查詢( INSERT A )沒有回滾? 我錯過了什么? 為了讓它工作,我必須改變什么?

最近添加到我們的 Quarkus 文檔中的這一段應該可以幫助您: https://quarkus.io/guides/reactive-sql-clients#transactions

它具體解釋了在使用 Reactive SQL 客戶端時如何處理事務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM