一、使用方式
(1) 正常执行
(2) 放弃事务
(3) 全体连坐
(4) 冤头债主
(5)watch监控
二、常见命令:
DISCARD: 取消事务,放弃执⾏事务块内所有的命令
EXEC: 执⾏所有事务块内的命令
MULTI: 标记⼀个事务块的开始
UNWATCH: 取消WATCH命令对所有key的监视
WATCH key [key .....]: 监视⼀个或多个key.如果在事务执⾏之前这些key被其他命令所改动.那么事务将被打断
正常执⾏-例⼦:
1、 开始⼀个事务:MULTI
2、 添加三条数据:
set k1 v1
set k2 v2
set k3 v3
3、提交事务 :EXEC
放弃事务-例⼦:
当我们在做⼀系统操作时,突然发现前⾯某⼀个指令有问题,不想把这些指令提交时可以通过 DISCARD 放
弃执⾏开启事务后的这些指令
1、 开始⼀个事务: MULTI
2、 修改⼀条数据:set k1 123
3 、此时我们不想修改 k1的值了.我们可以取消事务的提交:DISCARD
全体连坐-例⼦:
当我们在进⾏⼀系统命令提交的时候,如果其中某⼀个命令出错没有成功执⾏.那么本批次的命令全部放弃.
1 开始⼀个事务: MULTI
2、 执⾏⼀些指令:
# 其中第四条指令是错误指令,⽆法执⾏.
set k1 v1
set k2 v2
set k3 v3
asdfasdf
set k4 v4
set k5 v5
3 、提交事务: EXEC
4 、结果:本次执⾏的指令⼀个也不会成功.原因因为第四条指令执⾏失败.导致全体连坐
冤头债主-例⼦:
1 开始⼀个事务:MULTI
2 执⾏⼀些指令:
INCR k1
set k4 v4
set k5 v5
显然,k1的 value 是 v1,所以他是不能够做加1运算的.但是这条指令没有问题.错的是在执⾏的时候会出错.
不像全体连错⾥⾯的命令压根就是错误的.
3 提交事务: EXEC
4 、结果 : 这⾥的结果我们看⻅.只有第⼀条执⾏失败了.其余两条都成功了.这的意思就是如果命令没有错.
因为数据问题导致的错误.那么谁错的就是谁的.不会造成连坐
watch监控
悲观锁,乐观锁,CAS(check and set)
悲观锁: 表锁,⼀⼈操作.多⼈排队,⾼并发性能差.
乐观锁: 当多⼈前后短时间内操作同⼀条数据时.给操作⾏数据⼀个version.某⼈修改的时候确定是否还
是他最开始要修改的那个版本数据,如果不是.那么需要重新进⾏GET新数据并修改.
1、准备数据
花呗额度 1000块,吃饭使⽤10块.
花呗 : huabei
⽋款 : debt
set huabei 1000
set debt 0
2、 操作前开启监控
WATCH huabei
3 、开启事务
MULTI
4 、消费10块,额度减⼩10块.⽋款增加10块
DECRBY huabei 10
INCRBY debt 10
5、 提交事务 :exec
最后总结 :
修改数据前⼀定要进⾏数据监控.确保修改提交时与修改前是同⼀版本.
如果提交时发现版本不同,可以通过 UNWATCH取消监控,重新监控.
另:⼀但执⾏了 exec,那⾏之前监控锁都将被取消.
Watch指令类似于乐观锁.事务提交时.如果Key的值已被其他客户端改变.⽐如某个list已被别的客户端
push/pop过.整个事务队列都不会被执⾏.
事务三阶段:开启、队列、执⾏