redis事务相比较于mysql的事务来说比较的简单并且不想mysql的事务完善,下面简单的介绍下。
在mysql中事务的四个特点原子性,一致性,隔离性,持久性。但是在redis中并没有很好的实现。在redis中我们可以通过multi来开启事务,在执行事务的过程中,我们可以保证的是一个客户端在执行命令的的过程中不会受到其他客户端的影响,在事务中如果执行多条命令的话,首先命令会被放在一个队列中,等到执行exec的时候队列中的事务会被提交。但是redis事务一个明显的缺陷是,他的原子性以及事务的回滚做的很不好,看下面的例子
redis-cli
set name hello
set age 20
multi
incr name
incr age
exec
上面的例子中,我设置了两个key,其中一个name---hello,另外的一个keyage----20,然后对两个key进行了加1的操作,但是name是不能够进行加1的,所以在执行的过程中incr name返回值是0,代表的是操作失败。但是此时我们的redis数据库仍然会将事务进行提交。最后执行的结果就是age进行了加1的操作,但是name没有进行加1的操作,这显然是不符合事务的逻辑的。事务应该是要么都执行,要么都不执行的。所以redis在这方面需要改进。
同样如果我们想要放弃我们事务队列中对数据库的修改,直接discard即可恢复。