概述
Redis事务的作用: 就是串联多个命令防止别的命令插队。
事务之间的关系:
主要分为两种模式: 组队中和执行
先来看一下命令:
mulit
: 发起组队, 将进行的操作写入到事务中
exec:
执行事务
discard:
终止事务的执行
事务的错误的两种情况:
- 组队中遇到错误, 全部都会执行失败
- 执行中遇到错误, 其他的继续执行, 错误的就失败
图解情况:
为什么要有事务呢?
答: 为了防止多个客户端对同一条数据作处理, 导致数据紊乱的问题
事务冲突的问题怎么解决呢?
解决的两种方式:
- 悲观锁: 对操作的数据,每次
操作前都加上锁
, 操作完之后,再释放, 缺点: 影响数据的读写效率 - 乐观锁: 对操作的数据加上版本号, 操作完之后就更改
版本号,
如果你操作的版本号和数据的版本号不一致时, 就操作失败.Redis就是用这种操作来解决事务冲突问题的
图解:
Redis实现乐观锁的命令实现:
watch key : 可以监视一个或者多个key
unwatch key : 取消对key的监控
实际操作中可能遇到的问题?
- 连接超时问题:
原因: redis无法一下操作过多的客户端,需要等待,等待时间过长
解决:使用jedis连接池 - 超卖问题: 原因: 没有加上事务的操作 解决: 加上事务
- 库存遗留问题:
原因: 版本修改问题,当事务监控的数据修改过后,虽然库存还有,但是因为进行了修改版本,所以也无法更改成功. 认定失败
解决 : 使用Lua脚本来解决; 使用java代码中的同步代码块