您的位置:首页 > 数据库 > Redis

Redis事务还能这么玩?

2020-07-14 06:06 113 查看

一、
Redis
事务是什么

  可以一次执行多个命令,本质是一组命令的集合。一个事务中所有命令都会序列化,按顺序地进行串行化执行而不会被其他命令插入,不许加塞。说白了就是批处理,一次性执行一堆命令,

Redis
官网也明确说了支持事务,有关的命令有
MULTI
EXEC
DISCARD
WATCH
等,同时从
Redis 2.2
版本后支持
check-and-set
操作

二、
Redis
事务能干嘛

  一个队列中,一次性、顺序性、排他性的执行一系列命令,对于传统的关系型数据库来说一致性要求特别严格,一系列命令要么全部成功要么全部失败。

NoSQL
并不是这样,继续往下看。

三、
Redis
事务怎么玩


  官网给出了玩转事务的方法。使用

MULTI
命令开启事务,这个命令一般会返回
OK
,但是虽然告诉你这事我收到了,我知道你开启了事务但这事办不办的成两说。这时候你需要提交一系列命令,
Redis
会将这些命令入队,所有的命令将在
EXEC
后依次执行,而
DISCARD
则是取消这次失误,比如你一口气敲了五个命令,发现其中一个出现了错误,你不想再执行就可以使用该命令放弃本次批处理操作。下面将具体介绍一下怎么玩…

3.1 正常执行

清空一下当前数据库,开始玩转事务

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)

通过

MULTI
开启事务,依次输入五条命令

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

这是第一种情况,命令按序执行

3.2 放弃事务

DISCARD
命令的使用,当发现一个事务中某条命令有错误想要终止本次事务

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get k5
(nil)

下面开始事务的正规玩法

3.3 全体连坐

全体连坐型,这和关系型数据库的事务基本一致,一个命令失败全部失败

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> getset k7
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k8 v8
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"

很显然

getset k7
命令出错导致整个事务全部失败,下面来看看
Redis
事务的特色。

3.4 冤头债主

先看操作

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v2
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

这个时候发现虽然在事务中有出错的命令,但是正常的命令却没有失败,即在

Redis
事务中,正确的命令可以通过,出错的事务
EXEC
执行时报错,典型的冤有头债有主做法。总结一下
Redis
事务,一句话:
Redis
支持部分事务

3.5 watch监控

  

watch
监控可以实现
check-and-set
功能,是一种乐观锁处理机制,下面大体说一下乐观锁、悲观锁的概念。
  悲观锁:对事物的发展很悲观,认为一定会有问题产生,为了防止出事,在修改数据时直接把整张表锁了。
  乐观锁:对事物发展乐观,为了防止数据不一致,采用version的方式。线程A拿到id为5的数据去修改,线程B也要去拿id为5的数据准备修改,此时数据的版本号为1,当线程A修改完提交后版本号变为2,这时候线程B准备提交发现版本号变了,立刻报异常,只能再次读取数据修改后再次提交,直到修改完成为止。乐观锁机制再修改数据时不会加锁。
在监视
balance
时候,在另一个地方修改了
balance
值,最终导致事务失败,本次修改操作失败,同时在另一个客户端能够修改表名
watch
时没有上锁,使用的是乐观锁机制。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: