一文带你了解 MySQL 和 Redis 事务实现对比

本文对比了MySQL和Redis在事务实现上的区别。MySQL通过undolog保证原子性,redolog确保持久性,MVCC实现隔离性,提供四种隔离级别。而Redis不具备原子性,其事务执行时不回滚,RDB和AOF异步持久化可能导致数据丢失,但单进程单线程执行保证了隔离性。

我们都知道,如果要实现事务,需要整体保证 ACID(A-原子性|C-持久性|I-隔离性|D-一致性) ,其中一致性是目标,原子性、持久性和隔离性都是手段,所以这里对比一下 MySQL 和 Redis 在事务实现上的区别,当然严格意义上来说,Redis 由于不满足原子性,不能算真正意义上实现了事务。

原子性

MySQL - 原子性

MySQL 的原子性是通过 undolog 保证的,undolog 是 MySQL 的回滚日志,保存的是数据的历史版本,通过历史版本让数据在任何时候都可以回滚到某一个事务开始之前的状态,所以如果事务执行失败了,可以通过 undolog 来保证到原子性。

Redis - 原子性

Redis 没有实现原子性,Redis 的官方文档是这么解释的,所以严格意义上来说,Redis 没有实现事务,因为不能回滚。

It’s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

持久性

MySQL - 持久性

MySQL 的持久性是通过 redolog 保证的,redolog 是 MySQL 的前滚日志,记录数据修改的操作日志,通过操作日志可以保证数据库的数据不丢失。

Redis - 持久性

Redis 严格意义上来说,也没有保证到持久性,这是因为它的持久化策略中不管是 RDB 还是 AOF 都是异步执行的,这样还是有可能会造成数据丢失。
不过 MySQL 除非使用双1的配置,也就是 sync_binlog 和 innodb_flush_log_at_trx_commit 的配置都是 1,否则也是不满足持久性的;因为如果主机发生异常重启/掉电,还是有可能会造成数据丢失。所以这里可以认为 Redis 部分实现了持久性。

隔离性

MySQL - 隔离性

MySQL 里面定义了四种标准的隔离级别,通过 MVCC(Multi-Version Concurrency Control,多版本并发控制) 来实现个不同隔离级别的隔离,简单来说,通过数据的版本来控制数据的可见性。

读未提交 - Read Uncommitted

可能会读到其他事务未提交的数据,也就是脏读

读已提交 - Read Committed

读取的数据可能会前后不一致的情况,因为读取的数据可能在事务执行的过程中被修改了。

可重复读 - Repeatable Read

事务一旦开始,事务过程中读取的数据就不能被修改。
但是依然可能会发生幻读,因为可重复读虽然保护了读取的数据,但是其他数据插入后依然可能满足当前的查询条件,造成幻读

序列化 - Serializable

系统中的所有事务都串行执行。虽然可以避免所有数据不一致的情况,但是性能下降明显,一般不建议使用。

Redis - 隔离性

Redis 的事务在执行的过程中,就不会处理其它命令,而是等所有命令都执行完后,再处理其它命令。所以只要执行了 multi,就会阻塞其他操作。因此 Redis 事务是满足隔离性的。

总结

最后我们可以用一个表格来总结 Redis 和 MySQL 在事务实现上的区别。

MySQLRedis
A - 原子性undo log
C - 持久性redo logRDB + AOF
I - 隔离性MVVC命令单进程+单线程执行

本文亦通过 NoOne’s Blog 发表。

参考资源链接:[金融项目微服务部署:中间件搭建容器化实战](https://wenku.youkuaiyun.com/doc/1hny2bccni?utm_source=wenku_answer2doc_content) 在金融项目中实现微服务架构的容器化部署并确保中间件的高可用性数据一致性,是一项技术性极强的任务。《金融项目微服务部署:中间件搭建容器化实战》一文提供了实际操作的详细步骤架构设计,能够帮助你解决这个问题。 首先,关于Docker的安装配置,你需要按照文档指定的版本进行安装,并确保对旧版本进行卸载数据清理,以便于新版本的正常运行。Docker Compose作为容器编排工具,能够帮助你定义运行多容器Docker应用程序。你需要为每个中间件服务编写docker-compose.yml文件,其中包括服务的镜像版本、数据卷映射、网络模式依赖关系。 以MySQL为例,你需要在容器化部署中设置好持久化存储,并配置好相关的网络设置以确保服务间通信。此外,通过设置适当的资源限制监控,可以保证MySQL服务的高可用性。同样,对于Apollo配置中心Redis缓存服务,你也需要遵循类似的步骤,确保数据的一致性服务的可扩展性。 对于高可用性,通常需要利用Docker容器的副本机制来实现。对于关键的服务如MySQL,还可以通过部署主从复制或多节点集群来进一步确保数据的持久性一致性。Apollo作为配置中心,同样需要考虑其高可用部署,以保证配置信息的及时同步访问。 在数据一致性方面,除了中间件自身的高可用配置外,还需要考虑应用层对于数据一致性的处理逻辑。通常,结合事务管理适当的缓存策略可以有效保证数据的一致性。对于依赖关系复杂的服务,还需要设计健壮的服务间通信机制,例如消息队列RMQZookeeper,这些都可以在《金融项目微服务部署:中间件搭建容器化实战》中找到相应的配置部署细节。 通过上述步骤,你不仅能够实现微服务架构的容器化部署,还能保证关键中间件的高可用性数据一致性,从而为金融项目提供稳定可靠的后台支持。建议在解决当前问题后,继续阅读《金融项目微服务部署:中间件搭建容器化实战》中的高级话题,如服务网格、持续集成部署(CI/CD)等,以全面提高你的微服务实践能力。 参考资源链接:[金融项目微服务部署:中间件搭建容器化实战](https://wenku.youkuaiyun.com/doc/1hny2bccni?utm_source=wenku_answer2doc_content)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值