[英]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;
});
}
}
EntityBDao
和EntityCDao
類似於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.