Redis中的事务是什么?
Redis事务是一个单独的格离操作, 事务中的命令都会序列化, 按顺序的执行. 事务在执行的过程中, 不会被其他客户端发送来的命令请求打断.
Redis事务的主要作用就是串联多个命令, 防止别的命令插队.
事务相关命令: Multi, Exec, discard
通过multi命名, 打开事务, 然后正常的使用各种命令即可(这个过程称为组队阶段), 最后需要提交事务输入exec命令(执行阶段), 如果需要放弃执行, 则输入discard命令.
事物的错误处理
需要注意的是:
- 事务的组队阶段如果出现错误(正常会显示queued), 整个事务执行时就会报错, 并且不会执行任何操作.
- 而执行阶段出现错误, 在exec后, 只有出现错误的那一条语句报错, 其他命令正常执行, 如下图所示.
事务冲突
例子:
三人共用一个账户, 里面有10000快
第一个人想花8000快, 第二个人想花4000快, 第三个人想要花1000快.
如果同时操作的话, 大家都以为账户里还有10000快, 最终会导致账户负金额.
所以我们就要用事务.
乐观锁, 悲观锁
- 悲观锁
悲观锁, 顾名思义, 取数据时, 悲观的认为大家都来和你抢, 所以上锁, 阻止其他人.
每次操作前先上锁, 被人就无法操作了, 等我操作完了, 所打开后别人才能继续操作.
缺点, 效率太低了, 只能一个一个的来.
- 乐观锁
乐观锁, 顾名思义, 乐观地认为拿数据的时候别人不会修改, 所以不会上锁.
给数据加一个字段, 版本号, 每个人都能得到数据及其版本号, 先完成操作的, 更新原来的数据以其版本号, 操作的慢的执行时会检测版本号是否一致, 不一致就不能操作.
乐观锁适用于多读地应用类型, 这样可以提高吞吐量, Redis就是利用这种check-and-set机制实现事务的.
watch key1 [key2 ..]
给key加乐观锁
实例:
1 | set k1 1000 |
1 | watch k1 |
Redis事务的特性
- 单独的隔离操作: 事务中的所有命令都会序列化, 按顺序执行, 事务在执行的过程中, 不会被其他客户端发送来的命令请求打断.
- 没有隔离级别的概念: 队列中的命令在没有提交之前都不会被实际的执行.
- 不保证原子性: 事务中如果有一条命令执行失败, 其后的命令仍会执行, 不会回滚.
- 跟mysql事务性相差较大