【问题标题】:grails error on save: cannot cannot execute nextval() in a read-only transaction保存时出现 grails 错误:无法在只读事务中执行 nextval()
【发布时间】:2014-06-18 20:45:00
【问题描述】:

在 Grails 中“从头开始”(用代码而不是表单)创建对象时遇到问题。以下是控制器(评估)中方法的代码 sn-p。

def newVol = new Vol(
              volType:type,
                app: assessmentInstance.app,
                assessment:assessmentInstance,
                dateFound: assessmentInstance.assDate,
                urlParam: url,
                volName: "TEST",
                volNote: "TEST"
         )

        newVol.save(validate:false,flush:true, failOnError:true)

结果是这个错误:

Class
org.postgresql.util.PSQLException
Message
ERROR: cannot execute nextval() in a read-only transaction

id 映射到 Vol 类中的生成器:

   static mapping = {
    id column:'vol_id'

    id generator: 'sequence',params:[sequence:'scan_sequence']
}

我真的不明白如何将保存视为只读事务。我尝试在我的域类上弄乱@transactional 设置,首先将readOnly 设置为false,然后删除@transactional,但它并没有改变任何事情。看起来我应该寻找使用数据库序列的替代方法。你怎么看?

更新 从上面代码所在的控制器中删除了 readonly=true 并且该代码有效。但是......移除它有什么副作用?

【问题讨论】:

    标签: grails


    【解决方案1】:

    问题是您为什么要在只读事务中执行写操作?如果您正在执行写入操作,那么删除 readOnly=true 绝对是正确的做法。

    如果您只是在执行读取操作,那么您不应将其删除。原因是拥有readOnly=true 可以提高性能,因为 Hibernate 不需要对只读事务执行脏检查。

    【讨论】:

    • 谢谢。答案是在脚手架过程中默认添加了 readOnly=true。
    猜你喜欢
    • 2019-09-04
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多