[英]Batch optimistic locking queries in 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-writing”持久性属性配置的。 但是,您可能仍然无法更改乐观锁语句,因为它取决于您的驱动程序和 EclipseLink DB 平台类:如果存在问题,代码需要确定哪个语句失败,以便它可以指示哪个对象参与了抛出 OptimisticLockException。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.