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

Redis的事务(部分支持)

2017-04-06 00:59 225 查看
假期过了,赶紧来更新一下东东,最近项目一直处于上线阶段,每天加班调试优化模块功能,导致好几天回到家已经是后半夜了。好了,言归正传。


关于Redis事务一些小小的总结

一说到事务,肯定想到的是像传统关系型数据库那样,要么全部成功,要么全部失败。事务的四大特性ACID信手拈来。但这里对不起了,Redis事务可跟关系型数据库不太一样了,因为它只是部分支持事务,下文会详细的说明。
是什么?可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他事务插入,不许加塞
能干嘛?一个队列中,一次性,顺序性,排他性的执行一系列命令
怎么玩?开启事务使用MULTI,但不见得开启,redis会返回ok代表我收到了,所有命令使用EXEC调用,使用DISCARD放弃事务,表示不玩了


常用的命令有:

WATCH key(keys) 监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断

MULTI 标记一个事务块的开始

EXEC 执行所有事务块内的命令

DISCARD 取消事务,放弃执行事务块内的所有命令

UNWATCH 取消WATCH 命令对所有 key 的监控

1:正常执行 MULTI … EXEC

2:放弃事务 DISCARD

3:全体连坐 要么全部成功,要么全部失败,命令错误

4:冤头债主 命令正确,但执行失败报错

5:watch监控:

悲观锁/乐观锁/CAS(check and set)

悲观锁:锁整张表,性能极差,但一致性很高

乐观锁:为了即保证高并发,又保证不说整张表,在每条记录后面加一个version版本号

无加塞篡改,先监控在开启MULTI,保证两笔金额变动在同一个事务内

有加塞篡改,横刀夺爱,先watch key 修改value 别人改了 那么失败了。 如果我知道别人改了,我先unwatch 在watch 在multi 然后修改 在exec提交执行

三个阶段:

1. 开启:以MULTI开始一个事务

2. 入队:将多个命令入队到事务中,找到这些命令并不会立即执行,而是放到等待执行事务队列里面

3. 执行:由EXEC命令触发事务

三个特性:单独的隔离操作:事务的所有命令都会序列化、按顺序地实行

没有隔离级别的概念:事务提交前任何指令都不会被实际执行

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,不回滚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 事务