通过数据库的同步事务(ISOLATION_SERIALIZABLE)来实现。
类似 spring 事务的处理方式,使用 AOP 实现。
实现原理,定义 Dblock注解,让后拦截添加注解的的方法。可以设置锁记录的 ID,或数据库中的查找的某一个字符串。
注解定义:
package cn.pc.ua.util.aop; @Target(value = ElementType.METHOD) @Retention(value = RetentionPolicy.RUNTIME) public @interface DbLock { public String value() default ""; public int id() default Integer.MIN_VALUE; }
拦截器定义
@Pointcut("@annotation(cn.pc.ua.util.aop.DbLock)")//切点 private void pointCutMethod() { } @Around("pointCutMethod()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { DefaultTransactionDefinition arg0 = new DefaultTransactionDefinition(); arg0.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE); TransactionStatus ts = txManager.getTransaction(arg0); //..... Object object = pjp.proceed(); log.debug("release db lock !"); txManager.commit(ts); //..... }
具体代码见附件!
------------------------------
有个大的问题,出错时没有事务回滚。
附件 已经修复!!!