共计 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 事务中如果有一条命令执行失败,其它命令依然会被执行,没有回滚。