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

Redis事务

2017-11-29 11:18 169 查看

什么是Redis事务

Redis事务就是一次可以执行多个命令,本质是一系列命令的集合,一个事务中,所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。

能做什么

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

怎么使用Redis事务

常用命令

DISCARD //取消事务,放弃执行事务块内的所有命令
EXEC //执行事务块内的所有命令
MULTI //标记一个事务块的开始
UNWATCH //取消WATCH命令对所有key的监视
WATCH key [key....] //监视一个(或多个)key,如果事务执行之前,这个key被其他命令改动,那么将会打断该事务


正常执行

->MULTI
->set k1 v1
->set k2 v2
->set k3 v3
->get k2
->EXEC


放弃事务

当中途不想执行命令时,使用DISCARD命令,放弃事务执行。

->MULTI
->set k1 v1
->set k2 v2
->set k3 v3
->get k2
->DISCARD


全体连坐

当一条命令加入队列失败的时候,所有命令都无法正常执行。该事务无效。

冤头债主

当一条命令加入队列成功,但是执行失败的时候,只有错误执行的那条命令失败,其他的正常执行。

watch监控

1.乐观锁、悲观锁、CAS(check and set)

2.案例,信用卡余额和欠款

2.1无加塞更新余额和欠款

2.2有加塞更新余额和欠款

3.unwatch

4.执行exec后,watch加的监控锁就会取消

5.总结:watch指令,类似乐观锁,事务提交时,如果key的值已经被别的客户端改变,比如list已经被pop/push过了,整个事务队列就不会执行;如果whtch监控了多个key,如果在事务执行过程中有key被修改过,exec的时候会报错,整个事务执行失败。

Redis事务的三个阶段

开启:multi命令开启事务。

入队:将多个命令加入到事务队列中,但是不会立即执行,等到exec命令时开始依次执行。

执行:由exec命令触发事务

Redis事务的三个特性

单独的隔离操作:事务中所有命令都会序列化,按顺序执行,事务在执行过程中,不会被其他客户端发来的命令请求打断。

没有隔离级别的概念:队列中的所有命令没有提交之前都不会被执行,因为事务提交前,任何命令都不会被实际执行,也就不存在“事务内的查询要看到事务内的更新,在事务外不能看到”这种问题。

不保证原子性:Redis事务中,如果有一条命令执行失败(冤头债主),其他命令会继续执行,不存在回滚操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 事务 笔记