欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Redis的基本事务操作以及Redis实现乐观锁

程序员文章站 2022-07-06 13:39:14
事务在我们学习关系型数据库MYSQL的时候,就了解过Mysql的事务的特性(ACID)。Nosql中redis的单条命令是具备原子性的, 但是在Redis事务中式不具备原子性的!也没有隔离级别的概念!Redis的事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行! ------队列 set set set 执行--------Redis事务的特性:一次性,顺序性,排他性!所有的命令在事务中,并不是之间执行!而是通过发起执行命令的时候才会执...

事务

在我们学习关系型数据库MYSQL的时候,就了解过Mysql的事务的特性(ACID)。

Nosql中redis的单条命令是具备原子性的, 但是在Redis事务中式不具备原子性的!也没有隔离级别的概念!

Redis的事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行!

 ------队列 set  set set 执行--------

Redis事务的特性:一次性,顺序性,排他性!

所有的命令在事务中,并不是之间执行!而是通过发起执行命令的时候才会执行!(通过Exec命令)

Redis的事务:

  • 开启事务(multi)
  • 命令入列(…)
  • 执行事务(exec)

演示Redis事务正常执行!

Redis的基本事务操作以及Redis实现乐观锁

演示放弃事务(discard):当我们放弃事务的时候,说明入列的命令并没有执行。

Redis的基本事务操作以及Redis实现乐观锁

演示事务执行失败,这里先要明白两个观点:
1.编译期异常错误,例如java中的编译期错误,我们使用的IDE工具会给你指出错误(说明代码有问题);在Redis的事务中,出现编译期错误(命令行有问题),事务中的所有命令都不会执行!
2.运行时异常错误,例如:1/0;这种错误只会在你执行代码后发现错误;
在Redis的事务中,如果事务队列中的命令存在语法性错误,其他命令是可以正常执行的!(又进一步说明了,Redis的事务不存在原子性!)

编译期异常:
Redis的基本事务操作以及Redis实现乐观锁

运行时异常:
Redis的基本事务操作以及Redis实现乐观锁

Redis中的监控(watch)

乐观锁:很乐观,觉得什么时候都不会出现错误,所以一般不会去上锁!

例如:Mybatis-plus框架中的乐观锁插件,两个线程同时间去修改一个公共的数据,在更新数据的时候,我们使用乐观锁插件去判断一下,是否在此期间有人修改过这个数据:
1.获取Version
2.更新时比较Version

Redis监控测试

正常执行成功:

Redis的基本事务操作以及Redis实现乐观锁执行失败:
Redis的基本事务操作以及Redis实现乐观锁Redis的基本事务操作以及Redis实现乐观锁Redis的基本事务操作以及Redis实现乐观锁

这里就和Mybatis-plus中的乐观锁机制一样,底层会去判断是否有人操作过监控的这个kv,如果发现操作过,那么事务执行失败。

本文地址:https://blog.csdn.net/qq_45979629/article/details/108970482

相关标签: redis