Redis - 事务操作

Redis - 事务操作

1、Redis事务:redis事务是一个单独的隔离的操作,事务中的所有命令都是序列化执行,事务在执行过程中不会被其他客户端的命令打断

2、作用:就是串联执行多个命令,防止其他别的命令插队

3、操作命令:

1)multi:开启事务
2)exec:执行命令操作,类似于mysql的提交事务
3)discard:在exec之前执行,取消事务

4、错误处理:

1)multi开启事务后,在组队阶段失败,执行命令阶段失败:
	比如:set key   # 这个命令失败,
	在执行exec时就会失败,因为之前的命令失败
2)multi开启事务、组队执行命令,在exec阶段失败

5、悲观锁:顾名思义,就是在每次拿到数据时都会人为别的操作会修改数据,所以就在每次拿到数据后先上锁,自己再执行操作,操作完再释放锁,mysql中的行锁,表锁,读写锁等都是悲观锁
本质:上锁 -> 执行操作 -> 释放锁(每次操作前先上锁)
优点:保证数据安全
缺点:效率问题,只能串行化处理,不能并行处理

6、乐观锁:顾名思义,就是每次拿到数据时,都认为别人不会修改数据,所以不给数据上锁。但是会给每个数据加一个版本号,每次操作后同步更新数据的版本号。当自己操作数据时获取最新的版本号和之前拿到的数据版本号做对比,如果版本号不一致(代表别人操作过数据),则放弃操作
本质:数据加版本号 -> 操作后更新版本号,操作前判断版本号是否被修改过
优点:适用于多读的操作

7、乐观锁在Redis事务中的使用:

在执行 multi 命令之前,添加watch key命令
watch key 命令:监视key的数据是否会发生变化,如果watch的key的值发生了变化,那么在exec时就不会执行成功(因为监听到数据的版本号发生了变化)

8、Redis事务特性:

1)单独的隔离操作:事务中的命令会序列化执行,执行过程中不会被其他客户端的命令打断执行
2)没有隔离的级别:事务中的命令在exec提交之前,不会被执行,所以没隔离级别(脏读幻读)
3)不保证原子性:事务中如果有一条命令执行失败,其余的命令仍会被执行,没有回滚操作
	multi
	写一系列命令,其中有个别命令是失败的
	exec操作,上述的一系列命令失败的会失败,成功的会执行成功,没有mysql那种事务的作用(要成功全部成功,要失败全部失败),且没有回滚
posted @ 2021-12-05 22:47  alisleepy  阅读(204)  评论(0编辑  收藏  举报