【问题标题】:Batch optimistic locking queries in EclipseLinkEclipseLink 中的批量乐观锁定查询
【发布时间】:2020-02-27 01:32:50
【问题描述】:

我们有一个包含 JPA 实体的代码库,每个实体都有一个带有 @Version 注释的 long 字段。在事务的过程中,乐观锁会在一些带有entityManager.lock(entity, LockModeType.OPTIMISTIC) 的实体上被抓取,因此当事务提交时,EclipseLink 会运行以下形式的查询:

UPDATE <table> SET VERSION = <x> where ((ID = <y>) AND (VERSION = <x>));

其中y 是实体的ID,x 是当前版本号(不会更新)。但是,由于某种原因,它会单独运行每个查询,就像这样(来自 MySQL 日志):

UPDATE TableA SET VERSION = 5 WHERE ((ID = 1) AND (VERSION = 5));
UPDATE TableA SET VERSION = 4 WHERE ((ID = 2) AND (VERSION = 4));
UPDATE TableA SET VERSION = 3 WHERE ((ID = 3) AND (VERSION = 3));
UPDATE TableA SET VERSION = 2 WHERE ((ID = 4) AND (VERSION = 2));
UPDATE TableA SET VERSION = 1 WHERE ((ID = 5) AND (VERSION = 1));
-- etc

而我们希望将同一张表的所有查询集中到一个UPDATE

我们需要在某处设置一些标志来启用它吗?一个典型的事务可以为同一个表生成数百个这样的查询。

【问题讨论】:

    标签: java mysql jpa eclipselink optimistic-locking


    【解决方案1】:

    使用"eclipselink.jdbc.batch-writing" 持久性属性配置批量写入。但是,您可能仍然无法更改乐观锁语句,因为它取决于您的驱动程序和 EclipseLink DB 平台类:如果出现问题,代码需要确定哪个语句失败,以便它可以指示哪个对象参与了抛出 OptimisticLockException。

    【讨论】:

    • 是的,我们已经配置好了。我担心您可能是对的,因为无法批量处理乐观锁语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多