【问题标题】:I need to lock row from reading by other transaction我需要锁定行不被其他事务读取
【发布时间】:2014-12-12 07:55:51
【问题描述】:

我有一个要求,我需要锁定表的行以供其他事务读取。 方法, 如果事务 1 读取表 1 的少量记录。事务 2 不应读取这些行

我有以下环境 1. MySQL 2.Jboss 5.1 3. JPA 1.0

请告诉我你的建议

我正在使用本机查询选择进行更新 查询 createNativeQuery = entityManager.createNativeQuery("select id from cscache where id = ? for update ");

但它给出了以下错误

2014-12-12 09:35:42,326 错误 [org.hibernate.util.JDBCExceptionReporter] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“限制 2”附近使用正确的语法 (http-0.0.0.0-8543-5:)

【问题讨论】:

  • 对于 JPA 1.0,仅支持 2 种锁定模式,optimistic read/ optimistic write,这两种模式允许任何事务读取和更新实体。它只会在事务提交时检查。

标签: java mysql jpa jboss


【解决方案1】:

你可以这样使用。

LOCK TABLES tbl_name 读取;

更多详情。请点击here

【讨论】:

    【解决方案2】:

    SELECT FOR UPDATE 应该可以解决问题。

    YourClass c = em.find(YourClass.class, yourId,
        LockModeType.PESSIMISTIC_WRITE);
    

    TypedQuery<Table> q = em.createQuery("select t from Table t where ...", Table.class);
    q.setLockMode(LockModeType.PESSIMISTIC_WRITE);
    

    【讨论】:

    • 我有 JPA1.0 它不支持 LockModeType.PESSIMISTIC_WRITE
    • 哦,对不起。我的坏 - 应该尝试更仔细地阅读。本机查询是一个选项(使用 SELECT ... FOR UPDATE)吗?
    • np...我也在寻找更新选择..很快就会更新你
    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2014-08-21
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多