ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis中有事务吗?有何不同? [打印本页]

作者: 莫张周刘王    时间: 2024-11-22 10:00
标题: Redis中有事务吗?有何不同?
与关系型数据库事务的区别

Redis事务是指将多条命令加入队列,一次批量实行多条命令,每条命令会按次序实行,事务实行过程中不会被其他客户端发来的命令所打断。也就是说,Redis事务就是一次性、次序性、排他性的实行一个队列中的一系列命令。
Redis事务和关系型数据库的事务不太一样,它不保证原子性,也没有隔离级别的概念。
事务不保证原子性,但是Redis命令自己是原子性的
Redis事务的运行流程

Redis事务相关命令

没有隔离级别

当事务开启时,事务期间的命令并没有实行,而是加入队列,只有实行EXEC命令时,事务中的命令才会按照次序实行,也就是说事务间就不会存在数据脏读、不可重复读、幻读的标题,因此就没有隔离级别。

事务不保证原子性

如上图所示,在通过EXEC实行事务时,其中命令实行失败不会影响到其他命令的实行,因此并没有保证同时成功和同时失败的原子操作,尽管这样,Redis事务中也没有提供回滚的支持

官方理由为:保证Redis的性能
多数事务失败是由语法错误大概数据结构类型错误导致的,语法错误说明在命令入队前就进行检测的,而类型错误是在实行时检测的,Redis为提升性能而采用这种简单的事务,这是不同于关系型数据库的,特别要留意区分。Redis之所以保持这样简易的事务,完全是为了保证高并发下的核心标题——性能。
语法错误(编译器错误)

在开启事务后,A的转出操作命令打成了DECRBYa,最终会导致事务提交失败,所有命令都不会实行,A、B保存原值。
  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379(TX)> DECRBYa A 500
  4. (error) ERR unknown command 'DECRBYa', with args beginning with: 'A' '500'
  5. 127.0.0.1:6379(TX)> INCRBY B 500
  6. QUEUED
  7. 127.0.0.1:6379(TX)> EXEC
  8. (error) EXECABORT Transaction discarded because of previous errors.
  9. 127.0.0.1:6379> mget A B
  10. 1) "1000"
  11. 2) "100"
  12. 127.0.0.1:6379>
复制代码
类型错误(运行时错误)

在运行时检测类型错误,此时势务并没有回滚,而是跳过错误命令继续实行, 效果B值改变、A保存原值。

小结

利用WATCH实现乐观锁

WATCH通过监视指定Redis Key,如果没有改变,就实行成功,如果发现对应值发生改变,事务就会实行失败,如下图:

三种方式可以取消监视:
面试题专栏

Java面试题专栏已上线,欢迎访问。
那么可以私信我,我会尽我所能资助你。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4