目录
概述
我们先看一下没有使用锁的时候会出现什么问题。
我们用两个客户端连接redis
我们现加入一个k1的值为100,然后再客户端1中开启事务对其加10
然后在客户端2也进行加10操作
在客户端1中进行exec操作我们看到值变成了110
然后再在客户端2中执行exec值变成了120
这就出现了问题了,虽然两次加10最后的值是120没错。但是问题是,对于客户端2来说,人家看到的第一次的值就是100,为什么加10却变成了120?
下面我们使用乐观锁来测试一下,看看效果是什么样的。
watch key1 [key2]加锁
在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
比如,我们设置一个k2 的值也为100
在客户端1中执行值为110
在客户端2中执行
就是因为版本号不一样了导致不能执行。
unwatch解锁
取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。
Redis事务三特性
- 单独的隔离操作 ----事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 没有隔离级别的概念 ---队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
- 不保证原子性 ---事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。(这个跟我们之前说的mysql是不一样的,mysql中的事务比如有三个操作,只要有一个出现錯誤那么就都不会执行,而redis不是这样的,我们之前介绍了,执行的时候出错的那个不会执行其他正确的还是会正常执行的)。