Redis 事务

Reids 事务的定义

redis 事务就是一次性,顺序性的执行一个队列中的一系列命令,说白了就是一个连贯操作。

重点

单条命令是原子性执行的,但事务不保证原子性,且没有自动回滚。

事务中任意命令执行失败,其余的命令仍会被执行。(和MySQL这种关系型数据库的区别)

Redis 事务 基本命令

1. multi:    标记一个事务块的开始

2. exec:    执行所有事务块的命令

3. discard:  取消事务,放弃事务块中的所有命令

Redis 事务使用的场景

已支付业务为例,正常情况下只有正常消费完成之后,才会减去账户余额。

但如果没有事务的保障,可能会发生消费失败了,但依旧会把账户的余额给扣减了。

Redis 扩展认知

我们知道,在关系型数据库中,比如MySQL,如果要使用事务,首先向数据库服务器发送BEGIN,
然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送COMMIT来确认之前所作的修改,
或者发送ROLLBACK来放弃那些修改。**
同样,Redis中也有简单的方法处理一连串相互一致的读操作和写操作。首先是以MULTI命令开始
事务,后续跟着一连串命令,最后以EXEC结束事务或者以DISCARD命令撤销所有命令并结束事务。
但是redis事务和MySQL事务最重要的一点区别是,Reids事务不管指令正确或者错误,都会执行,
中途遇见错误指令也会继续执行后面的命令,Redis并没有像MySQL那样的事务回滚机制。MySQL事务
中如果执行过程中发生了错误不仅后面的sql语句不会执行,还会进行数据回滚,这是二者事务的最大区别。
Redis的事务出错需要开发人员自己进行数据回滚等操作。
Redis官方解释是: 当事务的执行时,一般发生错误都是因为业务编程错误造成的,这种错误通常只会出现在开发环境中,
而基本很少会在实际的生产环境中出现(因为这种业务错误都会在测试的时候消灭),所以他认为没有必要为 Redis 开发
事务自动回滚功能,这和Redis追求的简单高效的设计主旨不符合。

**而mysql恰恰相反,mysql认为数据库有必要也有责任处理事务中报错的情况,所以mysql有自动回滚的功能。**

在redis中使用事务:

Mrliu:~ Mrliu$ redis-cli
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set test 123
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set test 456
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> 

你可能感兴趣的:(Redis 事务)