《redis in action》redis事务

2022-08-11 16:05:06 浏览数 (1)

在一些时候我们需要对redis中的多个数据进行复制或者删除等操作,但是这些命令不是一起执行的,他们都是单独的一个命令。所以redis提供了一些命令让多个操作一起执行,并不被中断。这些命令有:watch、multi、exec、unwatch和discard。

现在,我们讨论一下最简单的redis事务,也就是multi和exec命令。

1.什么是redis基础事务

在redis中,基础事务就是通过multi和exec指令提供的一个客户端去执行多个客户端命令,比如A、B、C这样,但是其他的客户端是不能中断该客户端提交的命令执行。redis中的事务和关系型数据库中的事务不是一回事,关系型数据库事务可以让指令部分执行,回滚和提交,但是在redis事务执行完毕之前,其中每个命令都是multi/exec事务执行过程的一部分。在该客户端执行完毕之后,其他的客户端才能去操作。我们可以理解为指令串行的。

基于上述描述,《reids in action》中,编写了多线程情况下对一个redis的string进行的自增操作,这块对比肯定是比较明显的,事务性的操作是不会导致数据的算数结果错误的。

Redis中的事务其实是将命令进行了缓存,然后当我们执行exec命令的时候才进行统一执行的。那么就会有以下三个问题。

1.当先redis发送待执行的命令的时候,如果发生语法错误,那么所有的命令都不会被执。说明的就是我们客户端发送命令到服务端,如果服务端发现有命令发生了错误,那么整个缓存的命令都将不会执行。

2.在缓存命令执行过程中发生错误,那么已经执行成功的命令不会回滚。发生错误的命令会在最后进行提示。如下图所示:

3.乐观锁失败

redis事务和乐观锁一起使用的时候,事务就可以变成有条件的提交。但是有以下注意事项,因为redis的乐观锁是使用watch命令。

WATCH命令必须在MULTI命令之前执行. WATCH命令可以执行多次. WATCH命令可以指定乐观锁的多个key,如果在事务过程中,任何一个key被其他客户端改变,则当前客户端的乐观锁失败,事务提交时,将丢弃所有命令序列. 多个客户端的WATCH命令可以指定相同的key. WATCH命令指定乐观锁后,可以接着执行MULTI命令进入事务上下文,也可以在WATCH命令和MULTI命令之间执行其他命令. 具体使用方式取决于场景需求,不在事务中的命令将立即被执行.

如果WATCH命令指定的乐观锁的key,被当前客户端改变,在事务提交时,乐观锁不会失败. 如果WATCH命令指定的乐观锁的key具有超时属性,并且该key在WATCH命令执行后, 在事务提交命令EXEC执行前超时, 则乐观锁不会失败.如果该key被其他客户端对象修改,则乐观锁失败. ———————————————— 版权声明:本文为CSDN博主「azurelaker」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/azurelaker/article/details/85045220

上述的注意事项说的很明白,乐观锁就是为了保障事务的安全而产生的,如果其他客户端修改了watch元素的key,那么当前的缓存的命令就会失效,但是如果事务自己本身修改了watch的key,那就不会失败,当然还有超时属性的情况,在超时时间内是不会失败的。

0 人点赞