【问题标题】:Select for update not working选择更新不起作用
【发布时间】:2015-02-11 08:20:58
【问题描述】:

我的以下本机查询不起作用:

Query createNativeQuery = entityManager.createNativeQuery(
   "select id from cscache where id=? for update ");

环境详情:

  1. Mysql 5.6
  2. Jboss 5.1
  3. JPA 1.0

错误:

2014-12-12 10:20:14,581 警告 [org.hibernate.util.JDBCExceptionReporter]

SQL 错误:1064,SQLState:42000 (http-0.0.0.0-8543-3:)

2014-12-12 10:20:14,581 错误 [org.hibernate.util.JDBCExceptionReporter] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 (http-0.0.0.0-8543-3:) 附近使用的正确语法 (http-0.0.0.0-8543-3:)

【问题讨论】:

  • 查询limit 2的代码在哪里?
  • 这是唯一没有限制的代码2。我猜Hibernate MySQL方言不支持选择更新

标签: java mysql hibernate jboss


【解决方案1】:

对于 Update 基本上对行进行了锁定,要使用 JPA 实现相同的目的,您需要使用 Lock Modes。要设置锁,你可以使用EntityManager或TypeQuery并使用LockModeType.PESSIMISTIC_WRITE。

参考this article

【讨论】:

  • 我有 JPA 1.0,其中 LockModeType.PESSIMISTIC_WRITE 不可用
【解决方案2】:

我实际上并没有在休眠中进行更新,但我相信您可以(并且应该?)在会话或查询对象上进行。为什么不让 hibernate 来代替执行原生查询呢? 根据关于锁定的文档(Chapter 5: Locking,您可以在会话或查询上设置锁定模式。

Cscache  cscache  = (Cscache )session.get( Cscache.class, id, LockOptions.UPGRADE );

指定 LockOptions 会导致执行 SELECT ... FOR UPDATE。

【讨论】:

    【解决方案3】:

    不熟悉 JPA,但您似乎没有告诉它 ? 的值是什么。查看setParameter

    【讨论】:

    • 我在下一行 createNativeQuery.setParameter(1, 19) 中有这个
    • 对,但不应该是?1而不是?吗?
    • 从 id=? 的 cscache 中选择 id 可以正常工作但如果你给更新它不起作用
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多