首页 > 代码库 > redis 事务
redis 事务
一。multi & exec
1. redis只能保证一个client发起的事务中的命令可以连续的执行, 由于redis是单线程来处理所有client的请求的,所以做到这点是很容易的。
redis> multiOKredis> incr aQUEUEDredis> incr bQUEUEDredis> exec1. (integer) 12. (integer) 1
2. discard: 取消事务
redis> multiOKredis> incr aQUEUEDredis> incr bQUEUEDredis> discardOKredis> get a"1"redis> get b"1"
3. 虽说redis事务在本质上也相当于序列化隔离级别的了。但是由于事务上下文的命令只排队并不立即执行,所以事务中的写操作不能依赖事务中的读操作结果。
redis> multiOKredis> incr aQUEUEDredis> incr bQUEUEDredis> discardOKredis> get a"1"redis> get b"1"
4. watch : 实现乐观锁
redis> watch aOKredis> get a"1"redis> multiOKredis> set a 2QUEUEDredis> exec1. OKredis> get a,"2"
连接断开,监视和事务都会被自动清除。 exec,discard,unwatch命令都会清除所有监视.
二。存在问题
1.redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令
redis> set a 5OKredis> lpush b 5(integer) 1redis> set c 5OKredis> multiOKredis> incr aQUEUEDredis> incr bQUEUEDredis> incr cQUEUEDredis> exec1. (integer) 62. (error) ERR Operation against a key holding the wrong kind of value3. (integer) 6
2.当事务的执行过程中,如果redis意外的挂了,只有部分命令执行。如果我们使用的append-only file方式持久化,redis会用单个write操作写入整个事务内容。
即是是这种方式还是有可能只部分写入了事务到磁盘。发生部分写入事务的情况下,redis重启时会检测到这种情况,然后失败退出。可以使用redis-check-aof
工具进行修复,修复会删除部分写入的事务内容。
redis 事务
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。