Redis事务
Redis 事务本质:一组命令的集合。
一个事务中的所有命令,在事务执行过程的中,会按照顺序执行。
Redis 事务特性:一次性、顺序性、排他性。
Redis事务没有没有隔离级别的概念。
Redis事务不保证原子性。
所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行。
正常执行事务
# 1.multi : 开启事务
multi
# 2.命令入队
set k1 v1
set k2 v2
get k2
set k3 v3
# 3.exec : 执行事务
exec
放弃事务
# discard : 放弃事务
discard
编译型异常
命令有错 ,事务中所有的命令都不会被执行!
multi
set k1 v1
set k2 v2
set k3 v3
getset k3 ? ?# 错误的命令
set k4 v4
set k5 v5
exec ?# 执行事务报错!所有的命令都不会被执行!
运行时异常
类似1/0,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常!
set k1 "v1"
multi
incr k1 ?# 会执行的时候失败!
set k2 v2
set k3 v3
get k3
exec ?# 虽然第一条命令报错了,但是依旧正常执行成功了!
watch 监控,乐观锁
悲观锁: 很悲观,认为什么时候都会出问题,无论做什么都会加锁。
乐观锁: 很乐观,认为什么时候都不会出问题,所以不会上锁。 更新数据的时候去判断一下,在此期间是否 有人修改过这个数据, 获取version 更新的时候比较 version。
set money 100
set out 0
watch money #监控
multi
decrby money 20
incrby by out 20
exec #执行之前如果另外一个线程修改了监控的值,这个时候,就会导致事务执行失败!
#事务执行失败后,先解锁 unwatch ,再重新watch监视。
原文:https://www.cnblogs.com/yinrz/p/13031182.html