当前位置: 首页 > news >正文

MySQL 中的事务隔离级别有哪些?MySQL 默认的事务隔离级别是什么?为什么选择这个级别?数据库的脏读、不可重复读和幻读分别是什么?

MySQL 中的事务隔离级别有哪些?

1. 读未提交(Read Uncommitted)

  • 特点:一个事务可以读取另一个事务未提交的数据。如果一个事务对数据进行了修改但尚未提交,其他事务仍能读取到这些未提交的修改。
  • 优缺点
    • 优点:能够最大程度地实现并发性,减少锁定数据的时间。
    • 缺点:容易导致「脏读」问题,即读取到未提交的错误数据。
  • 适用场景:一般不常用,适用于对数据一致性要求不高且需要高并发的场景。

2. 读已提交(Read Committed)

  • 特点:一个事务只能读取另一个事务已经提交的数据。每次读取时,都会获取最新的数据版本。
  • 优缺点
    • 优点:避免了脏读问题,能读取到已提交的最新数据。
    • 缺点:可能会出现不可重复读问题,即多次读取同一数据时结果不一致。
  • 适用场景:适用于需要避免脏读但能接受不可重复读的场景。

3. 可重复读(Repeatable Read,InnoDB 默认级别)

  • 特点:在一个事务中多次读取同一数据时,结果一致。这通过多版本并发控制(MVCC)实现,确保事务开始后看到的数据是事务开始时的快照。
  • 优缺点
    • 优点:避免了脏读和不可重复读问题。
    • 缺点:可能会出现幻读问题,即插入或删除操作导致事务内查询结果不一致。
  • 适用场景
    • 是 MySQL InnoDB 的默认隔离级别,适用于大多数需要保证数据一致性的场景。
    • 通过锁定机制(如间隙锁、临键锁)可以一定程度上避免幻读。

4. 串行化(Serializable)

  • 特点:强制事务串行执行,确保事务执行时其他事务无法插入或更新数据。它通过在读取数据时加共享锁实现。
  • 优缺点
    • 优点:避免了脏读、不可重复读和幻读问题,事务隔离性最强。
    • 缺点:降低了并发性能,可能导致死锁或事务等待。
  • 适用场景:适用于对数据一致性要求极高且能接受低并发的场景。

各隔离级别支持的功能对比

以下是不同隔离级别在功能支持上的对比表格:

功能/隔离级别读取未提交数据(脏读)不可重复读幻读是否加共享锁(共享锁允许多个事务读取同一数据)
Read Uncommitted否(可能使用快照隔离)
Read Committed是(按需加锁)
Repeatable Read否(通常使用 MVCC,InnoDB 不加共享锁,而用快照)
Serializable是(加共享锁)

如何设置隔离级别

可以通过以下语句设置事务的隔离级别:

  • 临时设置(当前会话)

    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    

    支持的级别包括:READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

  • 全局设置

    SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    

通过选择合适的隔离级别,可以在数据一致性和并发性能之间找到平衡,以满足具体的业务需求。

MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

为什么选择可重复读作为默认隔离级别

1.平衡一致性和并发性能

  • 可重复读 在一致性和并发性能之间提供了合理的折中。它避免了脏读和不可重复读问题,同时通过多版本并发控制(MVCC)机制,允许多个事务并发执行,而不会互相阻塞。

2.避免常见并发问题

  • 脏读:一个事务读取了另一个事务未提交的数据,如果该事务回滚,会导致数据不一致。
  • 不可重复读:一个事务在多次读取同一数据时,结果不一致,因为其他事务修改了数据。
  • 可重复读 隔离级别通过 MVCC 机制,确保在一个事务中多次读取同一数据时结果一致,从而避免了这些问题。

3.适用于大多数应用场景

  • 可重复读 是一个较为严格的隔离级别,适用于大多数需要保证数据一致性的场景,如金融交易、库存管理等。它在保证数据一致性的同时,仍然能提供较高的并发性能。

4.实现机制

  • MVCC(多版本并发控制):在可重复读隔离级别下,MySQL 使用 MVCC 机制,允许多个版本的数据同时存在。每个事务看到的数据版本是事务开始时的快照,从而避免了数据不一致的问题。
  • ReadView:在事务开始时创建一个 ReadView,事务中的查询都基于这个 ReadView,确保多次查询结果一致。

总结

MySQL 默认的事务隔离级别是 可重复读,因为它在数据一致性和并发性能之间提供了合理的折中,避免了脏读和不可重复读问题,适用于大多数需要保证数据一致性的场景。通过 MVCC 和 ReadView 机制,可重复读隔离级别实现了高效的数据一致性和并发性能。

数据库的脏读、不可重复读和幻读分别是什么?

1. 脏读(Dirty Read)
  • 定义:一个事务读取了另一个事务尚未提交的数据。如果这个未提交的事务后来被回滚,那么第一个事务读取到的数据就是无效的(脏数据)。
  • 原因:事务隔离级别设置较低,如 未提交读(Read Uncommitted),导致读取到了未提交的数据。
  • 示例:假设两个事务 T1 和 T2:
    • T1 开始,并更新表中某条记录,但尚未提交。
    • T2 开始,读取了 T1 更新后的数据。
    • T1 回滚,T2 读取到的数据就变成了无效的。
2. 不可重复读(Non-Repeatable Read)
  • 定义:一个事务在两次读取同一数据时,因其他事务的修改,导致两次读取的结果不一致。包括数据被更新和删除两种情况。
  • 原因:事务隔离级别设置为 提交读(Read Committed)未提交读,其他事务在当前事务两次读取之间提交了对数据的修改或删除操作。
  • 示例:假设两个事务 T1 和 T2:
    • T1 开始,第一次读取某条记录。
    • T2 开始,修改该记录并提交。
    • T1 第二次读取时,发现数据已发生变化。
3. 幻读(Phantom Read)
  • 定义:一个事务在两次查询同一个范围的数据时,因其他事务插入或删除记录,导致前后两次查询的记录集合不一致。例如,第一次查询得到 10 条记录,第二次查询得到 11 条记录,多出的那一条记录被称为幻影行。
  • 原因:其他事务在当前事务两次查询之间插入或删除了符合条件的记录。
  • 示例:假设两个事务 T1 和 T2:
    • T1 开始,查询某个范围的记录,得到 10 条。
    • T2 开始,在该范围内插入一条新记录并提交。
    • T1 再次查询时,发现结果变为 11 条。

总结

  • 脏读 是读取到未提交的数据。
  • 不可重复读 是读取到已提交的更新或删除数据,导致两次读取结果不同。
  • 幻读 是读取到已提交的插入或删除数据,导致记录集合前后不一致。

相关文章:

  • 【System Verilog and UVM基础入门26】Verdi使用教程指南
  • Linux常用命令汇总
  • 电子科技大学考研复习经验分享
  • 微信小程序源码逆向 MacOS
  • [H滑动窗口] lc239. 滑动窗口最大值(模拟+数据结构+单调队列+滑动窗口模板题)
  • 猿大师播放器:交通水利、公安消防Web端Vue网页播放20路RTSP H.265 1080P监控视频流
  • 排序模板——C++
  • 互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书
  • 【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制
  • Docker 部署 Graylog 日志管理系统
  • uniapp写的h5跳转小程序
  • Postman参数介绍
  • Teledyne PDS 2025版本多波束测量及后处理成图软件
  • Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误
  • 【星云 Orbit-F4 开发板】03b. 按键玩法二:独立按键双击双击触发
  • ChatGPT背后的理论基础:从预训练到微调的深度解析
  • 06.模板初阶(template<typename T>,充分复用函数,函数模板和类模板的使用)
  • 防火墙双机热备---VRRP,VGMP,HRP(超详细)
  • 《我的AUTOSAR之路》Det 解析
  • 力扣练习之字符串的最大公因子
  • 宁波网站建设设计/百度推广客户端下载
  • 国际网站建设的目的/百度快照客服
  • 西峡做网站/2021最近比较火的营销事件
  • 谁帮助汉字叔叔做网站/推广普通话手抄报简单
  • 公司网站介绍模板 html/青海seo技术培训
  • 网页设计网站网站建设课程设计/百度查重软件