Redis 事务本质上是一组命令的集合,一个事务中的所有命令都会被序列化,在执行事务的过程中,会按照顺序执行。
Redis 没有隔离级别的概念,Redis 的单条命令可以保证原子性,但是事务不能保证原子性
redis 的事务:开启事务(multi),命令入队(set get),执行事务(exec) 取消事务(discard)
不能保证原子性的意思就是关系型数据库,在某一个失败了,会执行回滚操作,而redis 并不会,在事务执行的过程中,如果某一个命令有错误,前面执行成功的会成功,中间失败的就失败,直接执行后面的命令
不会有回滚这一操作。(运行时异常),编译时异常,则直接报错,所有的命令都不会执行。
watch 做乐观锁:
当某一个线程在执行A操作,同时开启事务,此时还没有执行事务的过程中,另一个线程修改了A 操作的值,此时用watch 监视,第一个线程去执行事务的时候,一定是失败的。
解决方式:在第一个线程执行事务之前,先放弃监视unwatch,然后获取最新的值,在次监视, 此时执行事务,就可以成功。
如图,执行失败之后,先unwatch ,然后,在去获取最新的值,然后在进行监视watch multi 事务等操作。