redis-事务

事务:一组命令的集合

特点

  1. 从事务开始,命令执行,事务结束。整个流程执行完才算事务结束
  2. 如果其中有某条命令执行失败,整个事务就算失败,所有执行的命令会回滚

命令

开启事务

multi:标记一个事务块的开始。

执行

exec:执行所有事务块内的命令。

撤销

discard:取消事务,放弃执行事务块内的所有命令。

部分支持事务

意思就是说redis的事务并不像oracle那样要求强一致性。

事务否能执行的两种情况:

  1. 如果在开启事务后某条命令错误,没有加入队列,在exec提交事务的时候,整个事务会失败,不会执行。
  2. 如果在开启事务后命令没有出错并加入了队列,但是最后提交事务的时候发现这条命令没有正确的结果,那么除了这条命令不会被执行外,其它命令都会被提交,执行。

表锁:在执行命令时将整张表锁了,不允许别人操作。有益于数据的一致性,但并发性不好

行锁:在执行命令时只锁要修改的那一条数据,其它数据允许别人操作。并发性好,数据一致性不好

悲观锁:对数据进行操作前都会上锁,包括行锁,表锁等

乐观锁:对数据进行操作前不会上锁,而且给要操作的数据添加一个version的标签,提交之后version会增加一,所以在提交时会进行判断,只有提交后版本大于当前版本才能提交成功。这就保证了在提交过程中没有其它人操作数据

watch&unwatch

watch监控是与事务搭配起来用的,它保证了在watch之后,事务的执行完成前(开启事务,提交之前)这些数据不会被别人修改。

watch key1 key2....:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

unwatch:取消已经监控的key。如果在watch开启之后,事务执行之前这个key被改动了,那么事务会失败。需要unwatch之前监控的key之后,才能再次重启监控。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
127.0.0.1:6379> set user1 libai
OK
127.0.0.1:6379> watch user1 # 开启监控
OK
127.0.0.1:6379> set user1 diaochang # 监控对象被修改
OK
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set user1 daqiao
QUEUED
127.0.0.1:6379> exec # 事务执行失败
(nil)
127.0.0.1:6379> get user1
"diaochang"

127.0.0.1:6379> unwatch # 取消监控
OK
127.0.0.1:6379> watch user1 # 再次监控
OK
127.0.0.1:6379> multi # 开始事务
OK
127.0.0.1:6379> set user1 daqiao
QUEUED
127.0.0.1:6379> exec # 执行事务
1) OK
127.0.0.1:6379> get user1 # 事务执行成功
"daqiao"

也就是说监控一旦开启之后,在事务执行执行完成前都不允许对监控对象进行修改,否则事务就失败。