mysql事物实现原理

说实话,执行MySQL事务是相当复杂的,但是如果你分解一下,那就没问题了。

原子性主要基于撤消协议和锁定。
例如,当你更新一条记录时,InnoDB首先记录该记录中发生了什么变化,比如:B.主键是什么,改变了哪些列,改变前后的值是什么。
如果以后发现需要回滚,可以使用Undo Log来恢复。
同时在更改数据时添加排它锁。
其他人无法同时更改这行数据,从而确保整个操作要么执行,要么根本不执行。

在一致性方面,Redolog 和 DoubleWrite 至关重要。
红色日志记录了页面的物理变化。
例如,如果这个保存数据被更改了,更改后会是什么样子? DoubleWrite 是内存缓冲区和磁盘上的共享表空间。
当坏页写回磁盘时,它们首先被复制到DoubleWrite内存缓冲区,然后两次写入磁盘共享表空间,最后写入你的实际表文件。
如果中间写入系统崩溃,可以从共享表空间恢复数据。

隔离取决于隔离级别。
例如读是未提交的、读数据不加锁(显式加锁除外)、写数据是独占锁。
读取提交的数据时使用MVCC(多版本并发控制)。
如果数据发生更改,首先会创建一个副本。
当你读取数据时,你会看到旧版本,并且回滚记录会记录在undo log中。
可重复读取还使用 MVCC 和一致性视图。
当事务开始时,会生成活动事务数组和高水位线,并使用 rowtrx_id 来确定数据是否可见。
序列化是最严格的,读加共享锁,写加排它锁。
读取和写入不能同时进行。

持久化主要基于BufferPool和Red Logs。
数据最初是放在BufferPool中的,ChangeBuffer专门记录二级索引中数据的增删改查,而不是放在BufferPool中。
事务提交时,先写入红色日志,然后写入BufferPool。
如果服务出现故障,可以依靠红色日志来恢复数据。

就是这样,无论如何,它相当复杂,但是如果你把它拆开并查看每个细节,你就会开始理解它。

mysql如何创建分布式数据库_mysql创建分布式数据库的部署方案

我们需要谈谈 MySQL 创建分布式数据库。
这取决于你的数据量、读写比、一致性要求、预算和技术能力。
常见的解决方案包括MySQLCluster、共享中间件、MGR、云服务解决方案。
我们要根据情况来选择。

我们先来说说MySQLCluster(NDBCluster)。
这个东西是基于NDB存储引擎的。
数据分布在多个节点上,可以同步复制和自动分片。
优点是性能高、可用性强、交易支持好。
但缺点是配置复杂,对硬件要求高,学习成本也高。
适用于对性能和可用性要求极高的OLTP应用,例如金融交易系统。

我们来谈谈MySQL+中间件(如ShardingSphere、MyCat、Vitess)。
它使用中间件将数据跨多个MySQL实例以块的形式存储,实现读写分区和水平可扩展性。
优点是灵活性、广泛的社区支持和低成本。
但缺点是必须维护中间件、分片间交易不稳定、分片键选择不当影响性能。
适合对海量数据存储和读写分区有明确要求的应用,例如电商订购系统。

还有MySQLGroupReplication(MGR),它是基于Paxos协议的。
所有节点都可以读写,数据非常稳定。
优点是配置简单、自动故障转移、数据持久性高。
但缺点是性能较低、网络延迟敏感、不适合海量数据共享。
适合读多写少、数据一致性要求高的中小型应用,例如会计系统。

我们来谈谈云服务解决方案,比如阿里云的POLARDB和腾讯云的TDSQL。
这些云厂商提供基于MySQL内核优化的分布式存储和自动化运维。
优点是快速部署、弹性扩展、无需管理底层硬件、支持全局一致性。
但缺点是成本较高,且受云厂商功能限制。
适合预算友好且希望减轻运维负担的Web应用,例如SaaS平台。

对于数据分区策略,范围分区、哈希分区、目录分区各有优缺点。
范围分区查询效率高,但数据分布不均匀容易出现热点; hash分区数据分布均匀,但分片间区间查询效率较低;目录共享逻辑灵活,但需要对目录服务进行额外的维护。

数据一致性保证方案包括强一致性模型和最终一致性模型。
两阶段委员会和Paxos/Raft适合可持续性强、高性能、高吞吐量,但可以读取旧数据;最终一致性允许暂时的数据不一致,性能较高,但可以读取旧数据,应用层必须处理冲突。

总之,分布式MySQL数据库没有“完美的解决方案”。
必须根据业务需求权衡性能、耐用性、成本以及操作和维护的复杂性。
建议通过压力测试和储备扩展接口来验证当前配置策略和一致性模型的效果,以应对未来的需求变化。
说实话,当时我并没有想太多。
现在想来,我确实要根据现在的情况来选择。