【发布时间】: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