Redis事务和乐观锁

Redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中.当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令.并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文
在这里插入图片描述
discard 命令其实就是清空事务的命令队列并退出事务上下文,也就是我们常说的事务回滚
乐观锁
大多数是基于数据版本(version)的记录机制实现的.何谓数据版本?即为数据增
加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个
“version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加 1.
此时,将提交数据的版本号与数据库表对应记录的当前版本号进行比对,如果提交的数据版
本号大于数据库表当前版本号,则予以更新,否则认为是过期数据.
对于Redis来说,也是支持乐观锁的,可以显式的使用 watch 对某个 key 进行加锁,避免悲观锁带来的一系列问题.

@Test
    public void redisTransactionTest() {
        String host = "192.168.0.106";
        int port = 6379;
        String password = "123456";
        Jedis jedis = new Jedis(host, port);
        jedis.auth(password);
        Transaction transaction = null;
        try {
             //开启监视
             jedis.watch("zhangsan");
            //开启事务
            transaction = jedis.multi();
            transaction.incrBy("zhangsan", 100);
            transaction.decrBy("lisi", 500);
            //提交事务
            transaction.exec();
            //解除监视
            jedis.unwatch();
        } catch (Exception e) {
            //如果发生异常,且事务已被开启,则回滚
            if (transaction != null) {
                transaction.discard();
            }
        }
    }

在这里插入图片描述

发布了67 篇原创文章 · 获赞 9 · 访问量 5166

猜你喜欢

转载自blog.csdn.net/Octopus21/article/details/104365758