定义

redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
redis事务的主要作用就是串联多个命令防止别的命令插队

redis事务三大特性

1.单独的隔离操作
事务中的所有命令都会序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
2.没有隔离级别概念
队列中的命令没有提交之前都不会实际被执行
3.不保障原子性
执行的过程中如果有命令执行失败,不会影响其他命令执行。

命令(Multi、Exec、discard)

从输入Multi命令开始,输入的命令都会依次进入命令队列中但不会执行(组队阶段),直到输入Exec后,Redis会将之前的命令队列中的命令依次执行(执行阶段)
组队的过程中可以用discard来放弃组队
image.png
组队的过程中如果有命令报告出错则所有命令都会取消不执行。
image.png
执行的过程中如果有命令执行失败,不会影响其他命令执行。
image.png

事务冲突

悲观锁

访问共享变量时,对该变量上锁,每次操作都要获取锁才可操作,当有人已获取锁其他人只能等待。
传统的关系型数据库就用到了这种锁机制,如行锁、表锁等。读锁、写锁等都是在操作前先上锁。

乐观锁

每次去获取共享变量时都认为没有人对其进行操作,但是在进行修改的时候就会去判断以下在此期间有没有其他人去更新这个数据,可是使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是利用这种check-and-set机制实现事务的。

命令 WATCH

watch key [key …]
在multi操作某个key前,先用watch key命令对该key进行监视,当多个multi同时对其进行操作时,只会有一个会操作成功。
属于乐观锁
示例如下:
image.png
image.png

redis秒杀任务案例

使用事务可以解决超卖问题,但会存在库存遗留问题
使用lua脚本可以解决超卖和库存遗留问题
使用list队列,100个库存在list放入100个值,使用rpop获取