我们正在使用Grails [Spring + Hibernate]并且有一个@Transactional服务方法(readOnly = true)。在开发过程中测试我们使用HSQLDB,行为是这样的,我们可以使用.save(flush:true),对象将被保存到数据库,但所有其他对象将被回滚。 当我们切换到Postgres时,一切都很棒。现在这个设置会抛出: 错误 - 交易是只读的。
编辑:
我们必须能够回滚事务中的所有数据,但仍然能够保存我们需要保存的数据[一些额外的东西,与事务无关,就像用于记录目的一样]。它不想使用任何数据库触发器来执行此操作。在提供原始请求后保存内容时,我们也不希望获得过时的对象异常。 关于我们如何实现这一目标的任何想法?我想到的唯一的事情是有一种注册表,我们将存储对已修改对象的引用,最后删除所有更改,但这是最后的手段。我确信有办法解决这个问题而不做愚蠢的事情。
答案 0 :(得分:2)
我认为spring只调用connection.setReadOnly(true),然后由jdbc驱动程序决定。也许HSQLDB jdbc只是作为优化某些东西的提示。 Posgresql docs在只读语义上很清楚:
当事务是只读时,不允许使用以下SQL命令:INSERT,UPDATE,DELETE和COPY FROM,如果它们要写入的表不是临时表;所有CREATE,ALTER和DROP命令;评论,授权,REVOKE,TRUNCATE;如果他们将执行的命令是列出的命令,则解析和执行。
答案 1 :(得分:0)
米兰。我和Krystian合作并解决了这个问题。我已经测试了所有的传播领域来解决它,但没有一个工作(PROPAGATION_REQUIRED,REQUIRES_NEW和NESTED看起来值得一试)。
答案 2 :(得分:0)