redis事务加锁之java操作

来源:互联网 发布:网络拓扑图素材 编辑:程序博客网 时间:2024/06/05 07:24

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);    }}

0 0
原创粉丝点击