数据库读写分离、事务的特性、事务隔离级别及默认级别、脏读不可重复读和幻读、更新丢失问题、写偏斜问题、MVCC

ops/2025/2/9 7:27:25/

数据库读写分离

        读写分离是将数据库的写操作和读操作分开处理,写操作全部在主库执行,读操作分布到从库中进行。

        目的是提升系统并发性能(缓解了锁的争用)、降低主库负载(减少了事务分配)、提高可扩展性和可用性(增加冗余),同时利用从库实现负载均衡和高性能查询。(从服务器可以使用MyISAM)

如果从服务器采用了MyISAM:

        MyISAM不支持事务和崩溃恢复,数据一致性较弱;因此,从库用MyISAM可能提高查询速度,但会导致主从数据一致性和恢复能力降低。

如果使用需要确保:

  • 主库和从库间的复制设置准确,监控同步延迟;
  • 从库仅用于只读查询,不参与写操作;
  • 明确数据一致性要求,了解潜在风险,最好保持主从使用相同引擎以保证一致性。

How:

  1. 配置主从复制,让主库将变更记录到二进制日志并同步到从库;
  2. 在应用层或通过中间件,将写请求发送到主库,读请求发送到从库;
  3. 监控同步延迟,并根据需要调整复制参数或增加从库。

事务的特性

是什么:事务是一组作为一个单元执行的数据库操作,满足原子性、一致性、隔离性、持久性(ACID)特性。

为什么:事务确保即使在错误或系统崩溃时,数据库数据仍保持一致和可靠,防止部分操作成功而部分失败带来的数据不一致问题。

怎么做:
通过使用 BEGINSTART TRANSACTION 开启事务,执行一系列操作后用 COMMIT 提交或用 ROLLBACK 撤销。

事务隔离级别及数据库默认级别

事务隔离级别定义了并发事务中,各事务之间相互“看不见”未提交数据的程度。常见的隔离级别有:

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)
    默认级别因数据库而异,例如,MySQL InnoDB默认是可重复读。

脏读不可重复读和幻读

是什么:

  • 脏读:读取到其他事务未提交的数据。
  • 不可重复读:同一事务中,多次查询同一数据返回不一致结果,因为其他事务修改了数据。
  • 幻读:同一事务中,多次执行查询出现额外的“幻影”记录,因为其他事务插入或删除了数据。

为什么:
这些现象由并发事务操作引起,隔离级别不够高时,事务之间会互相影响,导致数据不一致的问题。

怎么做:
通过设置适当的事务隔离级别来避免:

  • 脏读:可通过读已提交或更高隔离级别防止。
  • 不可重复读:可通过可重复读隔离级别防止。
  • 幻读:可通过串行化隔离级别防止或采用行级锁策略。

更新丢失问题

是什么:
数据库更新丢失问题指的是在并发更新同一数据时,由于没有正确处理更新顺序或冲突,导致部分更新被覆盖或忽略,最终数据没有反映所有预期的变更。

为什么:

  1. 并发更新时多个事务同时修改相同数据而未使用适当的锁或版本控制;
  2. 事务隔离级别设置不当导致读到脏数据或不可重复读;
  3. 应用层更新逻辑未正确考虑冲突处理,造成最后提交的事务覆盖先前的更新。

怎么做:

  1. 使用合适的事务隔离级别和锁机制(如行级锁、SELECT FOR UPDATE)确保并发更新安全;
  2. 采用乐观锁(版本号或时间戳机制)检测并解决更新冲突;
  3. 在应用层实现冲突检测和重试机制,确保所有更新都能最终正确写入。

写偏斜问题

什么是写偏斜问题:
写偏斜问题是一种并发事务问题,发生在多个事务根据条件读取数据并独立更新时,由于缺乏全局一致性检查,可能导致违反业务约束的更新。例如,两个事务在检查条件时看到的是同一状态,但在更新时导致不一致。

为什么会产生:
写偏斜的原因是事务的隔离级别不足,通常发生在 可重复读 (REPEATABLE READ) 或更低的隔离级别下。这些隔离级别保证每个事务看到的读取数据一致,但不保证全局一致性。

解决:

  • 使用更高的隔离级别 (SERIALIZABLE):确保事务按照全局顺序串行执行,避免并发事务的检查与更新导致数据不一致。缺点:性能下降,开销增加。
  • 显式锁:对需要检查和更新的行或表加锁,确保事务独占资源。例如:对账户表或总余额加写锁,避免并发修改。
  • 分布式事务控制:如果是分布式场景,可以使用二阶段提交协议 (2PC) 或类似机制,确保事务的一致性。
  • 业务逻辑优化:在应用层加约束,确保检查和更新逻辑统一,避免多个事务基于相同条件进行并发更新。

MVCC

是什么:
MVCC(多版本并发控制)是一种数据库并发控制机制,它为每个事务提供数据的快照,从而允许多个事务同时访问数据库,而不会互相阻塞。

为什么:
MVCC的目的是提高并发性能和系统吞吐量,避免因锁竞争导致的性能瓶颈,同时确保数据一致性,解决读写冲突问题。

怎么做:
数据库为每条数据维护多个版本,每个版本都有一个时间戳或事务ID。事务启动时获取一个数据快照,读操作访问快照数据,写操作则创建新版本,通过版本信息和事务状态判断数据的可见性和提交顺序。

产生背景:

  • 高并发场景的性能问题:
    在传统的锁机制中,事务为了保证一致性,会使用锁来阻止其他事务访问正在操作的数据。这种锁机制在高并发场景下容易导致大量事务等待,从而降低系统性能和吞吐量。

  • 读写冲突问题:
    事务在执行过程中,读操作和写操作之间的冲突会导致锁竞争,进一步降低并发性能。例如,一个事务正在修改某行数据,而另一个事务试图读取该数据,会造成等待或阻塞。

  • 提高一致性和隔离性:
    数据库需要满足事务的隔离级别(如可重复读),而传统锁机制容易增加复杂性和开销。MVCC 提供了一种更高效的机制,通过多版本的方式避免了锁竞争,同时满足一致性要求。

 


http://www.ppmy.cn/ops/156918.html

相关文章

Vue 入门到实战 八

第8章 组合API与响应性 目录 8.1 响应性 8.1.1 什么是响应性 8.1.2 响应性原理 8.2 为什么使用组合API 8.3 setup组件选项 8.3.1 setup函数的参数 8.3.2 setup函数的返回值 8.3.3 使用ref创建响应式引用 8.3.4 setup内部调用生命周期钩子函数 8.4 提供/注入 8.4.1 …

02.05、链表求和

02.05、[中等] 链表求和 1、题目描述 给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果。 2、解题思路 本题要求对两个链表表示的整数…

一文解释nn、nn.Module与nn.functional的用法与区别

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …

C# 比较两个List集合内容是否相同

在 C# 中&#xff0c;要比较两个 List<T> 集合的内容是否相同&#xff0c;可以通过以下几种方法&#xff1a; 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法&#xff08;顺序和内容都相等&#xff09; 顺序和内容都相等&#xff1a;使用 SequenceEqual。 usin…

Nginx与frp结合实现局域网和公网的双重https服务

背景&#xff1a; 因为局域网内架设了 tiddlywiki、 Nextcloud 等服务&#xff0c;同时也把公司的网站架设在了本地&#xff0c;为了实现局域网直接在局域网内访问&#xff0c;而外部访问通过frps服务器作为反向代理的目的&#xff0c;才有此内容。 实现的效果如下图琐事 不喜欢…

C# OpenCV机器视觉:利用TrashNet实现垃圾分类

在繁华的都市里&#xff0c;垃圾分类成了让人头疼的难题。阿强住在一个老旧小区&#xff0c;每天扔垃圾的时候&#xff0c;他都要对着垃圾桶纠结半天&#xff1a;“这到底是可回收物&#xff0c;还是有害垃圾啊&#xff1f;要是分错了&#xff0c;会不会被罚款&#xff1f;” 阿…

【C语言标准库函数】三角函数

目录 一、头文件 二、函数简介 2.1. 正弦函数&#xff1a;sin(double angle) 2.2. 余弦函数&#xff1a;cos(double angle) 2.3. 正切函数&#xff1a;tan(double angle) 2.4. 反正弦函数&#xff1a;asin(double value) 2.5. 反余弦函数&#xff1a;acos(double value)…

技术晋升读书笔记—人月神话

“人月”可以互换&#xff1f; “九个女人能一个月生下一个孩子&#xff1f;” “向延期的软件项目&#xff0c;临时增加人手&#xff0c;能快速完成&#xff1f;” 《人月神话》这本书堪称软件工程领域的经典之作。弗雷德里克布鲁克斯通过一系列精辟的论述&#xff0c;揭示…