深入理解redis——Redis的事务

1.数据库的事务概念
2.redis的事务处理
3.redis的事务性质总结
1.数据库的事务概念
我们最初接触事务这个概念的时候,是在大学课堂上,学习数据库的时候。
事务:事务是数据库操作的最小工作单元,这一操作要么完全地执行,要么完全不执行。因此事务处理可以确保除非事务中的所有操作都能成功完成,否则不会执行这些命令。
当我们提交一个事务的时候,该事务的任何一条sql再执行的时候,都会生成一条撤销日志,而撤销日志中记录的是和当前操作完全相反的操作,所以我们常说的数据库回滚就是去执行这些反操作日志。
事务的四大特性:
1 、原子性
事务中的所有操作要么全都执行,要么全都不执行。
2 、一致性
事务的结果必须是从一个一致性状态变到另外一个一致性状态。因此当数据库只包含成功事务提交的结果的时候,就证明数据库处于一个一致的状态。如果数据库系统在运行事务的时候发生了故障,有一半的事务执行成功,一般执行失败,这时的数据库就处于一种不一致的状态。
3 、隔离性
事务和事务之间是隔离的,不能相互干扰,
4 、持续性
一个事务一旦提交,对数据库中的数据的改变是永久性的。
2.redis的事务处理
redis的事务,可以一次性执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会被序列化,按照顺序地串行执行而不被其它命令插入。
我们先开看一下redis支持事务的命令:
深入理解redis——Redis的事务
文章图片

DISCARD 取消事务,放弃事务内所有命令 EXEC 执行所有事务块内的命令 MULTI 标记一个事务的开始 UNWATCH 取消watch命令对所有key的监视 WATCH 监视一个或者多个key,如果事务过程中这个key没变,那么事务将被打断

1)正常执行
深入理解redis——Redis的事务
文章图片

2)放弃事务
深入理解redis——Redis的事务
文章图片

3)事务全体执行失败
深入理解redis——Redis的事务
文章图片

当我们输入一个错误的命令的时候,所有redis事务的命令是不会执行的。
4)事务部分执行,部分不执行
深入理解redis——Redis的事务
文章图片

redis事务,不会回滚,如果一部分命令执行失败,可能会只执行一部分命令。
5)watch命令
watch会监视一个或者多个key的值,如果事务过程中的key没变,那么事务将会被打断。
我们可以先设置一个余额,然后在余额被篡改和余额不被篡改的情况下,看看执行之后会发生什么。
余额不被篡改,正常执行:
深入理解redis——Redis的事务
文章图片

余额被篡改,整个事务取消执行:
深入理解redis——Redis的事务
文章图片

监控了key,如果key被修改了,后面一个事务的执行失效
总结:
wathc指令,类似于乐观锁,事务提交的时候,如果key的值,已被别的客户端修改,整个事务队列都不会被执行。
通过watch指令在事务执行之前监控多个key,倘若watch只有有任何key的更改,exec都将被抛弃,返回Nullmulti-bulk应答以通知调用者事务执行失败。
由此可以得出,redis事务执行有3个阶段:
1)开启:以multi开始一个事务
2)入队:将多个命令入队到事务中,接到这些命令不会立刻执行,而是放到等待执行的事务队列里面
3)执行:由exec命令触发事务
3.redis的事务性质总结
【深入理解redis——Redis的事务】1)单独的隔离操作:以为主线程是单线程执行的,所以事务在执行的过程当中,不会被其它客户端发送的命令打断。
2)没有隔离级别的概念,队列中的命令没有提交之前都不会实际地被执行,且主线程是单线程执行,并不会存在事务内的查询要看到事务里的更新,在事务外的查询不能看到这种头疼的问题。
3)不保证原子性,redis事务中如果有一条命令执行失败,其它命令仍然会被执行,没有回滚。

    推荐阅读