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