虽然Redis是非关系型数据库,但是也是拥有一定的事务功能
1. 事务介绍
- 可以一次执行多个命令,本质是一组命令的集合。
- 一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞
2.事物使用
- 在命令行使用
multi
,命令行会返回一个OK
,表示事务开启,这时候可以输入一系列操作命令。 - 输入完一系列操作命令,使用
exec
来执行事事务 - 一旦不想使用事务的时候,命令行输入
discard
来取消使用事务
3.事务操作指令
3.1 常用指令
命令 | 描述 |
---|---|
multi | 标记一个事务块的开启 |
discard | 取消事务,放弃执行事务块内的所有事物 |
exec | 执行所有事物块里面的命令 |
watch [key …] | 监视一个或多个key,如果在事务执行之前key被其他命令所改动,事务中断 |
unwatch | 取消watch命令对所有key的监视 |
3.2 正常执行
3.3 放弃执行
3.4 全体连坐
3.5 冤头债主
- 与全体连坐的区别:
- 全体连坐在编译的时候已经报错了,所以执行全部不执行
- 冤头债主则是编译没有报错,所以执行时出现错误不影响其他语句执行
- 总结:Redis的事务是部分支持,不是全部都支持
3.6 watch监控
- 锁
- 乐观锁:在每条记录后面都添加一个版本号(Version),对记录进行操作时获取当前版本号,操作完准备提交前也获取一次版本号,一旦版本号不同,报出异常。版本号一样就成功提交。
- 悲观锁:一旦数据被人拿来就修改,就将整个数据库锁起来,等修改完后,才能给下一个人进行修改。
- watch使用例子(乐观锁):信用卡可用余额和欠债
- 取消监控:
- (1)输入命令
unwatch
- (2)一旦事务使用
exec
执行后,自动取消监控
- (1)输入命令
4. 总结
4.1 事务三阶段
- (1)开启:用
multi
命令开启一个事务 - (2)入队:将多个命令入队到十五中,接到这些命令并不会立即执行,而是方法哦等待执行的事务队列里面
- (3)执行:用
exec
命令执行事务
4.2 事务三特性
- (1)单独的隔离操作:事务中的所用命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
- (2)没有隔离级别的概念:队列中的命令没有提交之前都不会实际的执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里面的更新,在事务外查询不能看到”这个让人万分头疼的问题
- (3)不保证原子性:redis同一个事务中如果有一条命令执行失败,气候的命令仍然会被执行,没有回滚