分布式内存数据库--Redis事务

一、 事务:

与关系型数据库一样redis也支持事务。也就是可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

二、 事务能干嘛?

一个队列中,一次性、顺序性、排他性的执行一系列命令。

三、 redis事务支持的命令

1、 MULTI:标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。

2、 EXEC:执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。

3、 DISCARD:刷新一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。如果已使用WATCH,DISCARD将释放所有被WATCH的key。

4、 WATCH:标记所有指定的key 被监视起来,在事务中有条件的执行(乐观锁)。

事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

四、 redis事务的操作

1、 正常执行

这里写图片描述
使用MULTI开启一个事务,每当添加一个命令,将该命令加入队列,使用EXEC命令提交时全部执行。

2、 放弃事务

这里写图片描述
使用命令DISCARD取消事务。

3、 全体连坐

全体连坐的意思就是在一个事务中有一条语句语法有错误就会导致这条事务全部失效。
这里写图片描述
命令出错,所有的命令失效。

4、 冤头债主

意思就是在所有的命令均为正确的情况下,其中一条命令没有拿到数据,而导致该条数据为空,但是其他命令还是会执行成功。
这里写图片描述
K99不存在,但是其他的命令还是执行成功。

5、 WATCH操作

WATCH用于监控键是否发生改变。被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

悲观锁:

每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁:

每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
WATCH使用的是乐观锁策略。
一旦执行了exec之前加的监控锁都会被取消掉了。或者使用unwatch取消监控。

小结

1、WATCH类似于乐观锁,在事务提交时,如果key的值已被别的客户端改变,整个事务队列都不会执行。
2、通过WATCH命令在事务执行之前监控了多个keys,若在WATCH之后key的值发生了变化,EXEC命令执行的事务将被放弃。
3、事务的三阶段
开启–MULTI,入队,执行-EXEC。
4、事务的三特性
单独隔离操作、没有隔离级别的概念、不保证原子性(执行失败、集体连坐、冤头债主等)。

猜你喜欢

转载自blog.csdn.net/chenfengdejuanlian/article/details/54908647