hibernate - Transctional readOnly=true & 在 Grails 和 Postgres 中保存对象

标签 hibernate spring postgresql grails

我们正在使用 Grails [Spring+Hibernate],并且有一个服务方法是 @Transactional(readOnly=true)。在开发和测试期间,我们使用的是 HSQLDB 并且行为是这样的,我们可以使用 .save(flush:true) 并且对象将保存到数据库中,但所有其他对象将被回滚。 当我们切换到 Postgres 时,一切都很好。现在此设置返回: 错误 - 交易是只读的。

编辑:

我们必须能够回滚交易中的所有数据,但仍然能够保存我们需要保存的数据[一些额外的东西,与交易无关,比如用于记录目的的东西]。它不想使用任何数据库触发器来执行此操作。我们也不希望在处理原始请求后保存内容时出现 Stale Object Exceptions。 关于我们如何实现这一目标的任何想法?我唯一想到的是拥有某种注册表,我们可以在其中存储对修改对象的引用,并在最后删除所有更改,但这是最后的手段。我确信有一种方法可以解决这个问题而不用做愚蠢的事情。

最佳答案

我认为 spring 只是调用 connection.setReadOnly(true) 然后由 jdbc 驱动程序决定。也许 HSQLDB jdbc 只是将其作为优化某些内容的提示。 Posgresql docs只读语义很清楚:

When a transaction is read-only, the following SQL commands are disallowed: INSERT, UPDATE, DELETE, and COPY FROM if the table they would write to is not a temporary table; all CREATE, ALTER, and DROP commands; COMMENT, GRANT, REVOKE, TRUNCATE; and EXPLAIN ANALYZE and EXECUTE if the command they would execute is among those listed.

关于hibernate - Transctional readOnly=true & 在 Grails 和 Postgres 中保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8544635/

相关文章:

sql - 如何将 UPDATE CASCADE 添加到 Rails-Postgres 迁移中?

function - Postgresql:将输入键/值对转储到 PL/pgSQL 中的字符串变量中

sql - 如何同时按最大日期和组获取 grails 中的记录

java - 使用原生注释查询获得正确的流结果?

java - 我可以组合 OneToOne 和 OneToMany 的映射吗?

java - Spring Boot中分布式任务调度和Job队列的建议

ruby-on-rails - 销毁 Active Record 中的孤立多态关联

java - 无法使用 C3P0 在 Karaf 中创建 JPA 连接池

spring - Websockets - 带有 Spring Boot 和 STOMP 的 CSRF

spring - 如何在调度程序 servlet 中使用 web.xml 中定义的 context-param?