高同時ロックトランザクション再試行メカニズム(JPAが高く、楽観的なロック異常)


楽観ロック:
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の知識.