重要说明
Redis单条命令保证原子性,但是事务不保证原子性!
Redis事务中没有隔离级别的概念,关系型数据库中存在四个隔离级别【读未提交,读已提交,可重复读,序列化】
定义
事务是一组命令的集合,一个事务中的所有命令会被序列化到命令队列中,执行时会按照顺序执行。
特性
-
一次性:一次性顺序执行队列中的全部命令
-
顺序性:按照命令的入队顺序依次执行
-
排他性:事务执行过程不能被打断
事务操作
1、开启事务(multi)
2、命令入队(redis命令)
3、执行事务(exec)
4、放弃事务(discard)
##示例
#1.开启事务
multi
#2.命令入队:向List,Set,Hash,Zset中添加元素并获取元素
#设置值
lpush listKey gk gg yl
sadd setKey gk gg yl
hset hashKey h1 val1 h2 val2
zadd zsetKey 1 z1 2 z2 3 z3
#获取值
lpop listKey
smembers setKey
hget hashKey h1
zrange zsetKey 0 -1 withscores
错误类型
- 编译型错误:事务中的Redis命令语法有错误,事务中所有命令不会被执行
- 运行时异常:如果事务命令队列中不存在语法错误,其他命令会正常执行,异常命令会抛出异常
锁--Redis监控(watch)
- 悲观锁:认为什么时候都会出问题,无论进行何种操作都会加锁!
-
乐观锁:认为什么时候都不会出问题,不会上锁,更新数据的时候判断数据是否被修改!
情况1:事务执行成功,正常结束---更新数据期间没有其他修改操作
情况2: 一个事务未执行完时,另一个线程中的事务修改了变量,该线程中的事务执行失败!
1)开启一个事务命令入队并监听变量,但不执行事务----->当前事务执行出错!
2)开启新的事务,修改前一个事务中正在修改的同一个变量,并执行当前事务。
解决办法 :在执行当前事务之前,先解锁,再加锁,重新执行事务。(保证每次操作的值都是最新的!)