redis-事务
事务:一组命令的集合
特点
- 从事务开始,命令执行,事务结束。整个流程执行完才算事务结束
- 如果其中有某条命令执行失败,整个事务就算失败,所有执行的命令会回滚
命令
开启事务
multi
:标记一个事务块的开始。
执行
exec
:执行所有事务块内的命令。
撤销
discard
:取消事务,放弃执行事务块内的所有命令。
部分支持事务
意思就是说redis的事务并不像oracle那样要求强一致性。
事务否能执行的两种情况:
- 如果在开启事务后某条命令错误,没有加入队列,在exec提交事务的时候,整个事务会失败,不会执行。
- 如果在开启事务后命令没有出错并加入了队列,但是最后提交事务的时候发现这条命令没有正确的结果,那么除了这条命令不会被执行外,其它命令都会被提交,执行。
锁
表锁:在执行命令时将整张表锁了,不允许别人操作。有益于数据的一致性,但并发性不好
行锁:在执行命令时只锁要修改的那一条数据,其它数据允许别人操作。并发性好,数据一致性不好
悲观锁:对数据进行操作前都会上锁,包括行锁,表锁等
乐观锁:对数据进行操作前不会上锁,而且给要操作的数据添加一个version的标签,提交之后version会增加一,所以在提交时会进行判断,只有提交后版本大于当前版本才能提交成功。这就保证了在提交过程中没有其它人操作数据
watch&unwatch
watch监控是与事务搭配起来用的,它保证了在watch之后,事务的执行完成前(开启事务,提交之前)这些数据不会被别人修改。
watch key1 key2....
:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
unwatch
:取消已经监控的key。如果在watch开启之后,事务执行之前这个key被改动了,那么事务会失败。需要unwatch之前监控的key之后,才能再次重启监控。
1 | 127.0.0.1:6379> set user1 libai |
也就是说监控一旦开启之后,在事务执行执行完成前都不允许对监控对象进行修改,否则事务就失败。