共计 1377 个字符,预计需要花费 4 分钟才能阅读完成。
1. 数据库的事务概念
2.redis 的事务处理
3.redis 的事务性质总结
1. 数据库的事务概念
咱们最后接触事务这个概念的时候,是在大学课堂上,学习数据库的时候。
事务:事务是数据库操作的最小工作单元 ,这一操作要么 齐全地执行 ,要么 齐全不执行 。因而 事务处理能够确保除非事务中的所有操作都能胜利 实现,否则不会执行这些命令。
当咱们提交一个事务的时候,该事务的任何一条 sql 再执行的时候,都会生成一条撤销日志 ,而撤销日志中 记录的是和以后操作齐全相同的操作,所以咱们常说的数据库回滚就是去执行这些反操作日志。
事务的四大个性:
1、原子性
事务中的所有操作要么全都执行,要么全都不执行。
2、一致性
事务的后果必须是从一个一致性状态变到另外一个一致性状态。因而当数据库只蕴含胜利事务提交的后果的时候,就证实数据库处于一个统一的状态。如果数据库系统在运行事务的时候产生了故障,有一半的事务执行胜利,个别执行失败,这时的数据库就处于一种不统一的状态。
3、隔离性
事务和事务之间是隔离的,不能互相烦扰,
4、持续性
一个事务一旦提交,对数据库中的数据的扭转是永久性的。
2.redis 的事务处理
redis 的事务, 能够一次性执行多个命令 ,实质是一组命令的汇合。一个事务中的所有命令都会被序列化, 依照程序地串行执行而不被其它命令插入。
咱们先开看一下 redis 反对事务的命令:
DISCARD 勾销事务,放弃事务内所有命令 | |
EXEC 执行所有事务块内的命令 | |
MULTI 标记一个事务的开始 | |
UNWATCH 勾销 watch 命令对所有 key 的监督 | |
WATCH 监督一个或者多个 key,如果事务过程中这个 key 没变,那么事务将被打断 |
1)失常执行
2)放弃事务
3)事务整体执行失败
当咱们输出一个谬误的命令的时候,所有 redis 事务的命令是不会执行的。
4)事务局部执行,局部不执行
redis 事务,不会回滚,如果一部分命令执行失败,可能会只执行一部分命令。
5)watch 命令
watch 会监督一个或者多个 key 的值,如果事务过程中的 key 没变,那么事务将会被打断。
咱们能够先设置一个余额,而后在 余额被篡改和余额不被篡改的状况下,看看执行之后会产生什么。
余额不被篡改,失常执行:
余额被篡改,整个事务勾销执行:
监控了 key,如果 key 被批改了,前面一个事务的执行生效
总结:
wathc 指令,相似于乐观锁 ,事务提交的时候, 如果 key 的值,已被别的客户端批改,整个事务队列都不会被执行。
通过 watch 指令在事务执行之前监控多个 key, 假使 watch 只有有任何 key 的更改,exec 都将被摈弃,返回 Nullmulti-bulk 应答以告诉调用者事务执行失败。
由此能够得出,redis 事务执行有 3 个阶段:
1)开启:以 multi 开始一个事务
2) 入队:将多个命令入队到事务中,接到这些命令不会立即执行,而是放到期待执行的事务队列外面
3) 执行:由 exec 命令触发事务
3.redis 的事务性质总结
1)独自的隔离操作 :以为主线程是单线程执行的,所以事务在执行的过程当中,不会被其它客户端发送的命令打断。
2) 没有隔离级别的概念,队列中的命令没有提交之前都不会理论地被执行,且主线程是单线程执行,并不会存在事务内的查问要看到事务里的更新,在事务外的查问不能看到这种头疼的问题。
3)不保障原子性,redis 事务中如果有一条命令执行失败,其它命令依然会被执行,没有回滚。