`

并发锁事务重试机制(JPA高并发下的乐观锁异常)

 
阅读更多

 

        我的博文中,有一篇短文Java结合Junit做并发测试用例,是介绍JPA在高并发下,多个Service方法更新

同一个记录;在异常信息中有StaleObjectStateException和ObjectOptimisticLockingFailureException异常信

息。有些业务这种靠JPA维护的版本信息是可行的,如果两个不同用户同事(高并发)购买一件马丁靴鞋子,最后会更新该马丁靴在库数量,如果没有重试机制,肯定只有一个用户购买失败;可能这没有什么,用户再次提交购买就ok了;可是作为事逼可能成就人生的工程师,你一定不能容忍,于是有了重试机制。

 

1:解决方案

     定义Aspectj拦截器,指定方法发生乐观锁异常时,进行重试。

 

2:show coding.

 

(1) 因为不是所有方法发生乐观锁异常都是需要重试机制的,所以需要先定义切面接口定义IsTryAgain

/**
 * 自定义尝试切面接口
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface IsTryAgain {
    // marker annotation
}

 (2)Service接口方法加上切面接口定义

 

	
	/**
	 * 并发乐观锁需要重试的方法
	 */
	@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的知识。

 

 

 

 

 

 

分享到:
评论

相关推荐

    如何控制JPA的事务

    "JPA事务管理" JPA(Java Persistence API)是一种Java持久化规范,它提供了一个抽象层来访问关系数据库。JPA的事务管理是指对一系列操作的管理,包括创建、读取、更新和删除(CRUD)等操作。事务管理的目的是确保...

    jpa测试用例(很详细的介绍)

    - 测试JPA如何处理数据库异常,如UniqueConstraintViolationException(唯一约束违反异常)或OptimisticLockingFailureException(乐观锁失败异常)。 - 验证异常是否正确封装并抛出,以便在应用程序中进行适当的...

    spring+jpa+全局异常+单元测试

    Spring Data JPA是Spring框架的一个子项目,它简化了与JPA的集成,提供了更高级别的抽象,使得数据库操作更加便捷。 全局异常处理是任何应用都应该具备的重要特性,它可以统一捕获和处理程序中可能出现的异常,避免...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    吊打面试官之乐观锁实现源码

    但其缺点在于无法避免数据的脏读,即在并发环境下可能会丢失更新,需要额外的重试逻辑来处理这种异常情况。 总的来说,乐观锁是一种有效的并发控制手段,尤其适用于读多写少的场景。通过理解其工作原理和在...

    jpa例子jpajpa

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的对象-关系映射(ORM)。它提供了一种方式,让开发者可以用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。JPA允许你在...

    03_传智播客JPA详解_搭建JPA开发环境和全局事务介绍

    本教程将详细讲解如何搭建JPA开发环境以及如何理解与应用全局事务。 首先,我们需要了解**JPA的基本概念**。JPA提供了一种面向对象的方式来映射关系数据库,使得开发者可以使用Java对象来操作数据库,而无需直接...

    03_JPA详解_搭建JPA开发环境和全局事务介绍.zip

    通过以上步骤,我们可以构建一个完整的JPA开发环境,并了解如何在Spring框架下使用JPA进行全局事务的处理。JPA的使用极大地简化了数据库操作,而全局事务则保证了复杂业务场景下的数据完整性。学习和掌握这些知识...

    spring mvc jpa单元测试例子

    在Spring MVC和JPA的开发过程中,单元测试是不可或缺的一部分,它可以帮助我们验证代码的正确性,确保系统...通过合理运用Spring的测试注解和事务管理机制,我们可以编写出可靠且易于维护的单元测试,提高代码质量。

    JPA测试jar包

    此外,JPA提供了事务管理,可以与Spring框架集成,实现声明式事务处理。 压缩包子文件的文件名称列表中只列出了“lib”,这可能意味着这个jar包是一个库文件集合,其中包含了JPA所需的依赖和其他相关库。在Java项目...

    jpa 2.0 lock機制介紹1

    总结来说,JPA 2.0的锁机制为开发者提供了灵活的数据访问控制策略,确保了在并发环境下的数据安全。乐观锁通过版本号进行冲突检测,适用于低冲突场景;悲观锁通过立即锁定数据,适用于高冲突场景,但可能会引入额外...

    Java并发编程与高并发解决方案(高清视频教程).rar

    乐观锁和悲观锁也是并发控制策略,它们在数据库操作中广泛应用,例如Java的JPA和Hibernate框架。 此外,Java内存模型(JMM)规定了线程如何访问和修改共享变量,确保数据一致性。volatile关键字就是JMM的一部分,它...

    Hibernate part 14:查询及数据库并发事务

    4. **数据库事务**:在多用户并发环境下,事务是保证数据一致性的重要手段。Hibernate支持四种事务隔离级别(读未提交、读已提交、可重复读、串行化),开发者可以根据需求选择合适的级别。 5. **乐观锁与悲观锁**...

    JPA Demo 简单的了解下jpa

    JPA支持容器管理事务(CMT)和bean管理事务(BMT)。在CMT中,事务由应用服务器自动管理;而在BMT中,开发者需要手动调用`em.getTransaction().begin()`和`.commit()`。 **总结** JPA通过提供ORM能力,使得Java...

    jpa实现数据库操作

    - JPA支持乐观锁,通过@Version注解实现,检查更新时的版本号,防止并发冲突。 以上内容涵盖了JPA实现数据库操作的基础知识,随着项目的深入,你可能需要学习更多关于Spring与JPA集成的内容,包括Spring Boot、...

    JPA源文件/jpa学习

    同时,JPA也支持事务管理,与Java EE的容器管理事务(CMT)和应用程序管理事务(BMT)相兼容。 总之,JPA作为一个强大的ORM框架,为Java开发者提供了统一的、标准的方式来处理数据库操作,而JPA源码的学习可以帮助...

    JPA 2.0jar包及JPA2.0源代码

    9. **事务和并发**:JPA 2.0提供了丰富的事务管理选项,支持不同级别的并发控制策略,如Optimistic Locking(乐观锁)和Pessimistic Locking(悲观锁)。 10. **存储过程**:JPA 2.0允许调用数据库的存储过程,并将...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    它为Java开发者提供了一种对象关系映射(ORM)机制,将业务对象与数据库表进行映射,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。 **1. TOPLink JPA** TOPLink JPA是Oracle公司...

    高并发秒杀系统设计.docx

    "高并发秒杀系统设计" 高并发秒杀系统设计是指在电子商务平台中,设计一个能够承载高并发流量的秒杀系统,以满足用户的秒杀需求。该系统需要具备高性能、低延迟、可扩展性强等特点。 高并发秒杀系统设计的功能需求...

    Pro JPA2 精通JPA2

    4. **缓存机制**:JPA提供了一级缓存和二级缓存,分别用于缓存实体对象和查询结果,提高应用程序的性能。 5. **事件监听器**:允许在实体生命周期的特定点触发自定义代码,例如,在实体保存前进行预处理或在实体删除...

Global site tag (gtag.js) - Google Analytics