redis事务篇-05 - Go语言中文社区

redis事务篇-05


1.什么是事务?

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

redis的事务是一个队列中,一次性、顺序性、排他性的执行一系列命令。
mysql的事务是原子性,一致性,隔离性,持久性,可回滚的一系列命令。

redis的事务严格来说是半事务,没有回滚概念,且一致性不强,有冤头债主的执行效果。redis会根据事务开头命令MULTI得知下列一系列命令都是需要要进行事务操作的命令,需要保证它们的一致性。所以redis会将命令放入队列,在结束事务或者放弃事务使一次性,顺序性的执行,且在事务操作期间,可以设置监视,被操作的键将会被锁定,具有排他性,一旦被操作的键被其他客户端修改,那么事务放弃。

2.redis的事务命令

主要使用的是MULTI,EXEC,DISCARD,UNWATCH,WATCH key

命令 含义
MULTI 标志一个事务块的开始
EXEC 执行触发所有事务块内的命令
DISCARD 取消事务,放弃执行事务块内所有命令
WATCH key[key…] 监视一个或多个key,如果在事务执行前,这些key被其他命令改动,那么事务打断
UNWATCH 取消WATCH命令对所有key的监视

3.redis的事务学习

1.正常执行

这里写图片描述

2.放弃执行.
这里写图片描述

3.全体连坐.
这里写图片描述

如图,此处故意输错语法,导致事务块并没有执行。redis的 事务在事务块输入命令时如果产生错误,那么将不会执行该事务,具有一定的一致性

4.冤头债主
这里写图片描述

如图,因为username不是数字,无法递增,所以报异常,但是password的命令还是执行了

3和4可以理解为java的编译时异常与运行时异常。全体连坐的原因一般是语法错误等造成,冤头债主一般是运行时异常。

5.watch 监视键

上面的例子,你会发现,redis并没有对被操纵的键进行锁定。在事务块中被执行的键,其他客户端依旧能够修改它。所以有了watch锁定被执行的键,一旦被执行的键被其他客户端修改,那么此次事务放弃

这里写图片描述

另一个客户端

如图,第二张图是在事务块期间对username进行操作,导致此次事务失效,password和username并没有被执行

注意:
1.用unwatch将可以取消全部的监视
2.一旦事务块中涉及到的被监视键,那么当事务块进行exec后,该监视会被释放
3.watch指令类似于乐观锁

3.redis事务总结

redis的事务分三阶段

  1. 开启:以MULTI开始一个事务
  2. 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
  3. 执行:由EXEC命令触发事务

redis的事务有三特性

  1. 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2. 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
  3. 不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_32020035/article/details/80146085
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 19:11:40
  • 阅读 ( 761 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢