redis的事务是否具有原子性?

        众所周知,redis可以通过MULTI EXEC DISCARD等来实现“事务”。但是事务应该具有ACID 四大特性,下面我就来探讨一下redis的事务是否具有A——原子性。

        首先,我们看第一种情况,语句格式语法错误:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> hset myhash java 10
QUEUED
127.0.0.1:6379> hset myhash c 10
QUEUED
127.0.0.1:6379> hsetmyhash php 3
(error) ERR unknown command `hsetmyhash`, with args beginning with: `php`, `3`,
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> hgetall myhash
(empty list or set)

     可以看到这种情况在最后执行exec命令的时候提示事务错误,而且查看上面的的hash结构并没有设置成功,那么看起来redis的事务是具有原子性,但是真的是这样吗?我们看下面第二种情况吧,语句到运行的时候才产生错误:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> hset myhash java 10
QUEUED
127.0.0.1:6379> hset myhash c 10
QUEUED
127.0.0.1:6379> hset myhash php three
QUEUED
127.0.0.1:6379> hincrby myhash php 1
QUEUED
127.0.0.1:6379> hset myhash python 7
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (error) ERR hash value is not an integer
5) (integer) 1
127.0.0.1:6379> hgetall myhash
1) "java"
2) "10"
3) "c"
4) "10"
5) "php"
6) "three"
7) "python"
8) "7"

从上面的操作我们可以看出 hincrby myhash php 1 这条语句在执行的时候出现了错误 因为php的value值不是一个整数值所以并不能增加一,但是可以通过后面的提示以及hgetall的验证得知 这条语句前面和后面的正确的语句都执行了,并没有回滚前面以及不执行后面,所以我们可以看出这并不符合事务的原子性:要么全部不做 要么全做,因此我们其实可以得出结论,redis的事务没有原子性,redis只实现了部分事务。

 

 

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值