高同時ロックトランザクション再試行メカニズム(JPAが高く、楽観的なロック異常)
2281 ワード
楽観ロック:
質問シーン
まずライブラリでエンティティをクエリーし、永続状態に変換します.このとき、ライブラリのデータが変更され、versionが変更されます.このとき、永続状態エンティティがsave操作を行うと、楽観的なロック異常がトリガーされます.
1:ソリューション
Aspectjブロッキングを定義し、メソッドに楽観ロック異常が発生した場合に再試行します.
2:show coding.
(1)すべての方法で楽観ロック異常が発生するのではなく,機構を再試行する必要があるため,まず切面インタフェース定義IstryAgainを定義する必要がある.
(2)サービスインタフェースメソッドに切面インタフェース定義を加える
(3)Aspectjカットオフブロックの定義
再試行の切断方法を定義するのは、楽観的なロック異常が発生したときに、再試行の上限に達するまで、新しいトランザクションに前回の操作をコミットするためです.従って、接面はorgを実現する.springframework.core.Orderedインタフェースでは、フェースの優先度をトランザクション通知よりも高く設定できます.
3:その他
AOP知識、Spring AOPとAspectjの知識.
model version
@JsonProperty("_version")
@Column(name = "version", nullable = false)
@Version
private Long version = 0L;
質問シーン
まずライブラリでエンティティをクエリーし、永続状態に変換します.このとき、ライブラリのデータが変更され、versionが変更されます.このとき、永続状態エンティティがsave操作を行うと、楽観的なロック異常がトリガーされます.
1:ソリューション
Aspectjブロッキングを定義し、メソッドに楽観ロック異常が発生した場合に再試行します.
2:show coding.
(1)すべての方法で楽観ロック異常が発生するのではなく,機構を再試行する必要があるため,まず切面インタフェース定義IstryAgainを定義する必要がある.
/**
*
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface IsTryAgain {
// marker annotation
}
(2)サービスインタフェースメソッドに切面インタフェース定義を加える
/**
*
*/
@IsTryAgain
boolean TryAgainMethod() throws Exception;
(3)Aspectjカットオフブロックの定義
再試行の切断方法を定義するのは、楽観的なロック異常が発生したときに、再試行の上限に達するまで、新しいトランザクションに前回の操作をコミットするためです.従って、接面はorgを実現する.springframework.core.Orderedインタフェースでは、フェースの優先度をトランザクション通知よりも高く設定できます.
@Aspect
public class SystemArchitecture {
@Pointcut("execution(* myapp..service..*(..))")
public void businessService() {
}
}
@Aspect
class ConcurrentOperationExecutor implements Ordered {
private static final int DEFAULT_MAX_RETRIES = 2;
private int maxRetries = DEFAULT_MAX_RETRIES;
private int order = 1;
public void setMaxRetries(int maxRetries) {
this.maxRetries = maxRetries;
}
public int getOrder() {
return this.order;
}
@Around("myapp.SystemArchitecture.businessService()")
public Object doConcurrentOperation(ProceedingJoinPoint pjp) throws Throwable {
int numAttempts = 0;
PessimisticLockingFailureException lockFailureException;
do {
numAttempts++;
try {
return pjp.proceed();
}
catch(PessimisticLockingFailureException ex) {
lockFailureException = ex;
}
}while(numAttempts <= this.maxRetries);
throw lockFailureException;
}
}
3:その他
AOP知識、Spring AOPとAspectjの知識.