通过数据库给文件加锁

前几天有个应用需要多台服务器同时读取网络上的文件,一个文件只能一台服务器可以读取,首先想到的是 NIO 的文件锁(FileLock),不知道对网络上的文件是否可以加锁,没有测试过。为了通用,想到了用数据锁某条记录的方式来实现。

通过数据库的同步事务(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);
//.....
}


具体代码见附件!
------------------------------
[b]
有个大的问题,出错时没有事务回滚。
附件 已经修复!!!
[/b]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值