数据库的事务具有原子性,一致性。但是redis的事务有些特殊,下面会说。
命令中事务的执行
127.0.0.1:6379> multi OK 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k1 QUEUED 127.0.0.1:6379> exec
事务的取消
127.0.0.1:6379> multi OK 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> discard
中间的命令部分:
1)编译有错误,不会执行 比如getset k1, 这个命令本身就不对
2) 运行时异常,会被执行 比如 set k1 aa; incr k1 从这里可以看出redis的事务不保证原子性
乐观锁的实现
客户端1
watch money multi set money 100 exec
客户端2
set money 200
客户端先watch 然后客户端2修改了值 ,最终执行客户端1的exec,会导致客户端1执行失败
unwatch 取消监视
exec执行完之后,自动unwatch之前的watch