EclipseLink中的批量乐观锁定查询



我们有一个包含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中。

我们需要在某个地方设置一些标志来实现这一点吗?一个典型的事务可以为同一个表生成数百个这样的查询。

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

最新更新