事务
- Redis单条命令保证原子性的,但是事务是不保证原子性的
- Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行
- Redis事务没有隔离级别的概念
- Redis事务具有一次性、顺序性、排他性
- 所有命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行
Redis的事务:
- 开启事务(multi)
- 命令入队
- 放弃 / 取消事务(discard)事务中的命令都不会被执行
- 执行事务(exec)
Redis事务错误解决:
- 编译型异常(命令有错)事务中的所有命令都不会被执行
- 运行时异常,如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常
锁:Redis可以实现乐观锁
Redis监控(watch):
set money 100 --存钱100
set out 0 --花费0
#线程一
watch money --监视money
multi --开启事务
decrby money 20 --存钱用去20
incrby out 20 --花费20
#注意此处并不执行事务,现在有线程二在同一个redis客户端修改money
#线程二
incrby money 1000 --继续存入1000元,执行成功
#线程一 执行事务
exec --会返回null
#解决办法
unwatch --解锁
watch money --再次加锁,相当于MySQL中乐观锁再次获取version
解释: 在Redis事务中,用watch监视一个元素后,在事务1中对这个元素进行操作,在此期间如果有另一个事务2对该元素进行了修改,将会导致事务1执行失败,
解决办法: 监视元素,事务执行失败后,可以先解除监视,然后再从新监视,相当于获取最新的值,等同于MySQL实现乐观锁加version字段,获取最新version一样,执行事务时,它会自己去比对监视的值有没有发生变化,如果有变化执行失败,如果没有变化修改成功