我的博文中,有一篇短文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的知识。
相关推荐
spring+jpa+全局异常+单元测试spring+jpa+全局异常+单元测试spring+jpa+全局异常+单元测试spring+jpa+全局异常+单元测试spring+jpa+全局异常+单元测试
如何控制JPA的事务,非常全的。。如果不信就打开。够不够20,快够吧
jpa测试用例jpa测试用例jpa测试用例
hibernate常见异常,hibernatejpa注解使用开发的解决方案
03_传智播客JPA详解_搭建JPA开发环境和全局事务介绍
jpa测试用例2jpa测试用例2jpa测试用例2jpa测试用例2jpa测试用例2
JPA测试jar包
JPA教程JPA教程JPA教程JPA教程JPA教程
jpa jpa规范 jpa源码 jpa jpa规范 jpa源码
myeclipse开发,导入即可用,可以参阅http://www.cnblogs.com/shamo89/p/7326718.html
│ 14 乐观锁机制和重试机制在实战中应该怎么用.mp │ 18 生产环境多数据源的处理方法有哪些?.mp4 │ 19 如何搞清楚事务、连接池的关系?正确配置是怎样的?.mp4 │ 20 Spring JPA 中的 Hibernate 加载过程与...
jpa+hibernate单元测试 public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void save(){ EntityManagerFactory factory = Persistence....
作者:Samudra Gupta有关使用和部署 Java 持久性体系结构 (JPA) 的案例研究
JPA
jpajpajpajpajpajpajpajpajpajpajpajpajpa
03_JPA详解_搭建JPA开发环境和全局事务介绍.zip
包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注
maven工程下的springDataJpa测试demo,mysql数据库
一个简单的jpademo,可以简单的学习一下,超入门级
JPA视频_PPT及源码 · 1. JPA视频_概述 · 2. JPA视频_HelloWorld · 3. JPA视频_基本注解 · 4. JPA视频_Transient注解 · 5. JPA视频_Temporal注解 · 6. JPA视频_Table主键生成策略 · 7. JPA视频_...