码迷,mamicode.com
首页 > 其他好文 > 详细

redis 事务

时间:2014-08-26 00:08:55      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   strong   ar   问题   div   

一。multi & exec

1. redis只能保证一个client发起的事务中的命令可以连续的执行, 由于redis是单线程来处理所有client的请求的,所以做到这点是很容易的。

redis> multi
OK
redis> incr a
QUEUED
redis> incr b
QUEUED
redis> exec
1. (integer) 1
2. (integer) 1

2. discard: 取消事务

redis> multi
OK
redis> incr a
QUEUED
redis> incr b
QUEUED
redis> discard
OK
redis> get a
"1"
redis> get b
"1"

 3.  虽说redis事务在本质上也相当于序列化隔离级别的了。但是由于事务上下文的命令只排队并不立即执行,所以事务中的写操作不能依赖事务中的读操作结果。

redis> multi
OK
redis> incr a
QUEUED
redis> incr b
QUEUED
redis> discard
OK
redis> get a
"1"
redis> get b
"1"

4. watch : 实现乐观锁

redis> watch a
OK
redis> get a
"1"
redis> multi
OK
redis> set a 2
QUEUED
redis> exec
1. OK
redis> get a,
"2"

连接断开,监视和事务都会被自动清除。 exec,discard,unwatch命令都会清除所有监视.

 

二。存在问题

1.redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令

redis> set a 5
OK
redis> lpush b 5
(integer) 1
redis> set c 5
OK
redis> multi
OK
redis> incr a
QUEUED
redis> incr b
QUEUED
redis> incr c
QUEUED
redis> exec
1. (integer) 6
2. (error) ERR Operation against a key holding the wrong kind of value
3. (integer) 6

2.当事务的执行过程中,如果redis意外的挂了,只有部分命令执行。如果我们使用的append-only file方式持久化,redis会用单个write操作写入整个事务内容。

即是是这种方式还是有可能只部分写入了事务到磁盘。发生部分写入事务的情况下,redis重启时会检测到这种情况,然后失败退出。可以使用redis-check-aof

工具进行修复,修复会删除部分写入的事务内容。

redis 事务

标签:style   blog   color   使用   io   strong   ar   问题   div   

原文地址:http://www.cnblogs.com/yuyutianxia/p/3936112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!