【问题标题】:Write operations are not allowed in read-only mode (FlushMode.MANUAL):只读模式下不允许写操作(FlushMode.MANUAL):
【发布时间】:2011-12-01 20:27:18
【问题描述】:

Grails 1.3.7

我们有一个合并 2 个用户的服务方法。由于数据量很大,因此需要进行很多操作,因此需要进行大量读取,更新和写入。我们在服务中有 transactional=true。我知道 Grails 的默认 FlushMode 是 AUTO。我理解该错误消息的含义。

但是,它不会在本地发生,也不会在我们的暂存环境中发生。所有这些都以相同的权限运行相同版本的 MySQL(密码除外)。

我知道我可以更改默认的 FlushMode 行为,但我很犹豫,因为我无法在生产环境之外的任何环境中复制该行为。现在我只是想知道是否有什么可能导致这种情况实际上与 FlushMode 无关?

逐字错误消息是:

org.springframework.dao.InvalidDataAccessApiUsageException:写 只读模式下不允许操作(FlushMode.MANUAL):转 您的会话进入 FlushMode.COMMIT/AUTO 或删除“只读”标记 来自事务定义。

【问题讨论】:

  • 你能显示一些代码和/或错误信息吗?
  • 由于敏感的客户信息,我无法在不进行大量清理的情况下显示代码。我会解决这个问题,但我已经编辑了我的问题以包含错误消息,这与问题基本相同。
  • Gregg - 您是否配置了使用:只读的二级缓存?出于某种原因,我想我已经看到了类似的情况,我试图修改一个我配置了只读缓存的域对象。

标签: grails service transactions spring-transactions


【解决方案1】:

我在 Grails 1.3.7 应用程序中也看到了与这些类似的错误。就我而言,我的后端数据库遇到了一些锁争用问题,导致应用程序抛出无法获取锁异常。在点击其中一个之后,我们会看到许多与您看到的完全相同的 InvalidDataAccessApiUsageExceptions(巧合的是,也只发生在我们的 prod 环境中,而不是 dev 或 test)

您可能需要检查以确保您的 prod DB 用户可以访问 MySQL 中的锁定功能,并检查可能是实际根本原因的其他与数据库相关的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2011-07-21
    • 2014-04-26
    • 2011-10-12
    • 2015-03-14
    • 1970-01-01
    • 2014-10-03
    • 2018-01-20
    相关资源
    最近更新 更多