redis事务本质
一组命令的集合,单条命令是可以保证原子性的,但是事务不保证原子性。
一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。一次性、顺序性、排他性的执行一些命令。
-----队列 set 、get 、set 执行--
redis事务没有隔离级别概念。所有命令在事务中,并没有直接被执行,只有发起执行命令(exec)的时候才会执行
redis的事务开启以及执行过程:
1,开启事务(multi)
2,命令入队(…)
3,执行事务(exec)/放弃事务(discard)
执行事务:队列中的任务开始执行
放弃事务:队列中的命令都不会执行 命令 discard
redis事务异常情况
1,编译型异常(代码有问题,命令有错),事务中所有命令都不会执行
2,运行时异常,如果事务队列中存在语法错误,那么执行命令的时候,其他命令时可以正常执行的,错误命令抛出异常。如图,执行完成后队列中有的命令已经执行,有的运行时异常的命令未执行,验证了单条命令是可以保证原子性的,但是事务不保证原子性。
redis实现乐观锁(watch)
悲观锁和乐观锁
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都会加锁
乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁。更新数据的时候去判断下,在此期间是否有人修改过这个数据,做法是价格字段version,更新前获取version,更新的时候比较version。
使用watch命令监视(加锁)取消监视unwatch(解锁)
正常情况下
异常情况下
开启watch后,开启事务,事务未提交之前,另外一个线程去修改值,然后再去提交事务发现事务提交失败
修改money的值
再去提交事务,发现事务提交失败
异常之后(事务失败后)使用unwatch取消监视(解锁),再使用watch执行一边就可以修改数据