文章目录

  • 前言
  • Redis事务命令
  • 观察事务(不提交事务)
  • 正常事务处理并提交测试
  • Redis事务的bug
  • 总结

前言

Redis本身也支持事务,但其本身针对事务处理是具有设计缺陷的。

Redis事务命令

  • 打开事务:multi
  • 关闭事务:discard
  • 提交事务:exec

注意:

传统关系型数据库中针对事务,还具有commitrollback等操作,在redis中是不存在!

观察事务(不提交事务)

针对Redis事务的测试方式,此处可以设置一个key简单的数据,结合上述的事务命令完成测试。

  • 1、创建一条数据
127.0.0.1:6379> set age 10
 OK
  • 2、开启redis事务
127.0.0.1:6379> multi
 OK
  • 3、数据做修改操作,但不进行事务提交
127.0.0.1:6379> set age 20
 QUEUED
 127.0.0.1:6379> set age 30
 QUEUED
  • 4、关闭事务处理
127.0.0.1:6379> discard
 OK
  • 5、查看被修改数据
127.0.0.1:6379> get age
 “10”

redis 事务处理机制 redis事务操作_redis 事务处理机制


发现:

当开启事务,修改数据时,会出现QUEUED提示!

问:这个QUEUED是什么?

QUEUED表示一旦开启了Redis事务,所有的更新操作都会追加到一个更新队列中。

总结:

由于事务未进行提交操作,当数据修改后,未提交直接进行事务的推出操作后,该数据就会回滚至最初的数据!

正常事务处理并提交测试

redis 事务处理机制 redis事务操作_Redis_02


总结:

在事务开启情况下;
如果修改指定的数据,并使用了exec做了事务的提交操作;
此时才会真正影响到原始数据!

Redis事务的bug

在实际开发中,事务往往牵扯到非常多的业务操作,比如修改某条记录信息,删除另外一个数据信息,增加了另外一个数据信息等。正常的业务需求要求保证数据的原子性,要么这些操作同时成功,要么同时失败!

但在Redis中,却不满足上述的事务要求,看下面的例子:

创建两种数据类型的数据;
修改其中String类型的为自增
修改数字类型的数据依旧为数字
事务提交。
查看事务。

redis 事务处理机制 redis事务操作_数据_03


测试发现:

1、开启事务,由于id最初为String类型,设置自增操作,此时却未出现问题

2、事务的提交操作,出现了id修改失败的问题!但是age属性却修改成功了!

3、获取数据,发现age做了数据变更,但String数据类型却做了回滚!!!!

总结

Redis的事务并不满足同一事务的情况下,类似关系型数据库的数据原子性等。

因为Redis最初的设计,no-sql更多情况下都是考虑不处理事务的情况居多!