transactions - Quarks 反应式 Postgresql 事务
问题描述
我查看了使用响应式 SQL 客户端的指南(https://quarkus.io/guides/reactive-sql-clients#using),但我似乎无法弄清楚如何使用事务。假设我想通过使用事务来增强这个演示水果应用程序。
如果事务中的某些内容失败,我将如何使以下方法利用事务也恢复所有所做的更改?
public static Multi<Fruit> findAll(PgPool client) {
return client.query("SELECT id, name FROM fruits ORDER BY name ASC")
.onItem().produceMulti(set -> Multi.createFrom().items(() -> StreamSupport.stream(set.spliterator(), false)))
.onItem().apply(Fruit::from);
}
解决方案
您可以将父阶段与then()
或onItem().produceMulti()
授予所有子阶段访问父阶段项(在本例中为事务)的权限。这将允许后面的子阶段直接访问 Transaction 对象以进行关闭/回滚。
例如:
return pgPool.begin()
.onItem().produceMulti(tx -> {
return tx.query("DELETE FROM fruits").execute()
.onItem().invoke(delete -> tx.query("SELECT id, name FROM fruits ORDER BY name ASC").execute())
.onItem().produceMulti(set -> Multi.createFrom().items(() -> StreamSupport.stream(set.spliterator(), false)))
.onItem().apply(Fruit::from)
.onFailure().invoke(ex -> tx.rollback())
.on().termination(() -> tx.close());
});
推荐阅读
- javascript - Rails 6无限滚动未捕获ReferenceError:未定义InfiniteScroll
- css - 用 CSS3 为我的文本设置动画后,为什么它没有完全消失?
- python - 如何从 HTML 页面(与 Django 一起)调用带有参数的 Python 函数?
- r - 使用 Rvest 和 Glue 从网页抓取多个页面中创建聚合 df
- winapi - MFC:在 CWnd::OnCreate() 之后保证调用什么?
- r - 在R中添加一个系列作为列
- c# - 为什么我不能在 C# 中读取此注册表项
- r - 为什么将字符更改为日期格式会给我 NA 值?
- python - 旋转后的OpenGL python和pygame翻译不适用于mouselook和移动
- python - 广播/迭代字典值的有效方法