[英]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.