redis渐入佳境(08) 事务控制

的事务控制主要由如下几个命令:

MULTIEXECDISCARDWATCH

其中multi是用来开启一个事务、exec是提交事务、discard取消事务、watch是用来实现乐观锁。

注意:redis对事务的支持非常简单,它只能保证事务中的操作不被其他客户端打断。

还有redis事务不会自动回滚,也就是事务队列中不会因为一个操作的失败而自动回滚其他操作,这一点是与关系型数据库不一样的地方请注意。

下面就通过代码来实现一下事务:

[redies@localhost redis-2.4]$ redis-cli
redis 127.0.0.1:6379> auth xuelianbo
OK
redis 127.0.0.1:6379> keys *
1) "name"
redis 127.0.0.1:6379> multi   //开启一个事务的上下文
OK
redis 127.0.0.1:6379> set name xue  //执行各种写的操作
QUEUED
redis 127.0.0.1:6379> set name lian
QUEUED
redis 127.0.0.1:6379> exec //提交事务队列
1) OK
2) OK
redis 127.0.0.1:6379> get name
"lian"
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set name 1
QUEUED
redis 127.0.0.1:6379> discard  //取消事务队列
OK
redis 127.0.0.1:6379> get name
"lian"
redis 127.0.0.1:6379> set age 10
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr age
QUEUED
redis 127.0.0.1:6379> incr name
QUEUED
redis 127.0.0.1:6379> exec   //提交事务
1) (integer) 11  //此处就出现了,部分成功的现象
2) (error) ERR value is not an integer or out of range
redis 127.0.0.1:6379> keys *
1) "age"
2) "name"
redis 127.0.0.1:6379> watch age   //制造一个乐观锁,watch age
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set age 11
QUEUED
redis 127.0.0.1:6379> set age 12
QUEUED
redis 127.0.0.1:6379> exec
1) OK
2) OK
redis 127.0.0.1:6379> watch age  //制造一个乐观锁的情形, 提交前其他客户端修改了watch的对象
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set age 12
QUEUED
redis 127.0.0.1:6379> exec
(nil) //返回修改失败
redis 127.0.0.1:6379>

   下面是另一个客户端制造乐观锁的指令,其实就是在上面的回话watch的时候进行了age的修改。

[redies@localhost redis-2.4]$redis-cli
redis 127.0.0.1:6379> keys *
(error) ERR operation not permitted
redis 127.0.0.1:6379> auth xuelainbo
(error) ERR invalid password
redis 127.0.0.1:6379> auth xuelianbo
OK
redis 127.0.0.1:6379> keys *
1) "age"
2) "name"
redis 127.0.0.1:6379> set age 20
OK
redis 127.0.0.1:6379>

猜你喜欢

转载自xuelianbobo.iteye.com/blog/2089287