redis事务加锁之java操作
package com.czmec.redis.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
/** * Created by Administrator on 2016/12/6 0006. */ public class affairLock {
/** * 加锁 */ public boolean transMethod(){
Jedis jedis=new Jedis("112.74.34.11",6379);
int balance;//可用余额
int debt;//欠款
int amtTosutract =10;//实刷额度
jedis.watch("balance");
balance=Integer.parseInt(jedis.get("balance"));
if(balance<amtTosutract){
jedis.unwatch();
System.out.println("modify");
return false;
}else{
System.out.println("***********transaction");
Transaction transaction=jedis.multi();
transaction.decrBy("balance",amtTosutract);
transaction.incrBy("debt",amtTosutract);
transaction.exec();
balance=Integer.parseInt(jedis.get("balance"));
debt=Integer.parseInt(jedis.get("debt"));
System.out.println(balance);
System.out.println(debt);
return true;
}
}
/** * 通俗易懂的讲 watch命令就是标记一个键,如果标记了一个键,在事务提交前如果该建被别人修改过,那么事务就会失败 * 这种情况通常可以在程序中 重新在尝试一次。 * 首先标记了键balance 然后检查 余额是不是足够,不足就取消标记 并不做减扣,足够的话,就启动事务进行更新操作 * 如果在此期间 balance被其他人修改,那再提交事务(执行exec)时就会报错,程序中通常可以捕获这类错误再重新执行一次,知道成功 * @param args */ public static void main(String [] args){
affairLock testTransaction=new affairLock();
boolean retValue=testTransaction.transMethod();
System.out.println("main retValue---"+retValue);
}
}