文章目录
- 前言
- Redis事务命令
- 观察事务(不提交事务)
- 正常事务处理并提交测试
- Redis事务的bug
- 总结
前言
Redis本身也支持事务,但其本身针对事务处理是具有设计缺陷的。
Redis事务命令
- 打开事务:multi
- 关闭事务:discard
- 提交事务:exec
注意:
传统关系型数据库中针对事务,还具有
commit
、rollback
等操作,在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”
发现:
当开启事务,修改数据时,会出现
QUEUED
提示!
问:
这个QUEUED
是什么?
QUEUED
表示一旦开启了Redis事务,所有的更新操作都会追加到一个更新队列
中。
总结:
由于事务未进行提交操作,当数据修改后,未提交直接进行事务的推出操作后,该数据就会回滚至最初的数据!
正常事务处理并提交测试
总结:
在事务开启情况下;
如果修改指定的数据,并使用了exec
做了事务的提交操作;
此时才会真正影响到原始数据!
Redis事务的bug
在实际开发中,事务往往牵扯到非常多的业务操作,比如修改某条记录信息,删除另外一个数据信息,增加了另外一个数据信息等。正常的业务需求要求保证数据的原子性
,要么这些操作同时成功,要么同时失败!
但在Redis中,却不满足上述的事务要求,看下面的例子:
创建两种数据类型的数据;
修改其中String
类型的为自增
。
修改数字
类型的数据依旧为数字
。
事务提交。
查看事务。
测试发现:
1、开启事务,由于id
最初为String
类型,设置自增操作,此时却未出现问题
!
2、事务的提交操作,出现了id
修改失败的问题!但是age
属性却修改成功了!
3、获取数据,发现age
做了数据变更,但String
数据类型却做了回滚!!!!
总结
Redis的事务并不满足同一事务
的情况下,类似关系型数据库
的数据原子性
等。
因为Redis最初的设计,no-sql更多情况下都是考虑不处理事务的情况居多!