Sql(MySQL事务四大特性、事务隔离级别)

Sql(MySQL事务四大特性、事务隔离级别)

文章目录

  • Sql(MySQL事务四大特性、事务隔离级别)
    • [1. 事务的特性](#1. 事务的特性)
    • [2. 事务隔离级别](#2. 事务隔离级别)
      • [2.1 幻读](#2.1 幻读)
      • [2.2 处理幻读问题](#2.2 处理幻读问题)
      • [2.3 死锁问题](#2.3 死锁问题)
      • [2.4 隔离级别相关命令](#2.4 隔离级别相关命令)

1. 事务的特性

MySQL事务有四大特性。

  1. 原子性(atomicity):一个事务必须是一个不可分割的最小工作单元,整个事务所有的操作,要么成功提交,要么都失败回滚。
  2. 一致性(consistency):事务总是从一个一致性状态转换为另一个一致性状态。
  3. 隔离性(isolation):一个事务所作出的修改在还没有提交之前,对其他事务来说是不可见的。
  4. 持久性(durability):如果事务进行提交后,其所做的修改必须是永久性的,不会因为系统崩溃而丢失修改。

2. 事务隔离级别

SQL标准定义了四种隔离级别,较低级别的隔离通常来说系统开销更低些。

  1. READ UNCOMMITTED(未提交读):事务的修改,即使没有提交,对其他事务来说也是可见的。这是最低级别的事务隔离,企业生产中很少使用到。
  2. READ COMMITTED(提交读):事务在未提交前,所做的修改对其他事务是不可见的。这个隔离级别也称为不可重复读,主要是因为两次重复的数据读取,可能会产生两种完全不同的结果。
  3. REPEATABLE READ(可重复读):这个事务隔离级别保证了一个事务多次读取都是同样的结果,能够解决前面两个隔离级别可能产生的不可重复读问题。另外可重复读是MySQL默认的事务隔离级别。
  4. SERIALIZABLE(可串行化):该隔离级别会强制事务串行执行 ,同时对读取的每一行数据都加上锁,来。通过这种方式可以解决幻读 的事务问题,不过可能导致锁竞争问题和大量的SQL超时。

2.1 幻读

并发事务带来的问题主要有四种,可以用上面我们谈到的事务隔离级别来处理。

  1. 脏读:一个事务读取到另一个事务未提交的数据。

  2. 不可重复读:一个事务多次读取同一数据,另一个事务修改了 该数据,导致第一个事务第二次读取数据发现和第一次读取的数据不一致

  3. 幻读:一个事务多次读取同一数据,另一个事务给这些数据插入删除了某些内容 ,导致第一个事务数据的数量发生改变。

  4. 丢失修改:一个事务修改了某个数据,另一个事务与其读取同一数据且原始值都相同,另一个事务修改数据后提交,导致第一个事务的修改操作丢失。

2.2 处理幻读问题

幻读可以采用我提到的SERIALIZABLE(可串行化)隔离级别来解决幻读,事务按顺序执行,也就不会有幻读问题。

MySQL也提供了其他方法来处理幻读问题。

  1. 设置间隙锁,在两个索引值之间的数据进行加锁,可以杜绝其他事务在这个范围内对数据数量的影响。

  2. next-key锁就是间隙锁和行锁的组合 ,通过间隙锁锁住区间值 、行锁锁住行本身

2.3 死锁问题

死锁是因为多个事务互相占用对方请求的资源导致的现象,要打破这个问题需要回滚其中一个事务,这样另一个事务就能获得请求资源了,而回滚的事务只需要重新执行即可。

InnoDB引擎目前处理死锁的方法是通过持有行级排他锁的数量来判断,持有最少行级排他锁的事务会进行回滚。

2.4 隔离级别相关命令

MySQL默认隔离级别是可重复读,企业生产一般也是用的这个隔离级别。

查看隔离级别的指令:

sql 复制代码
select @@tx_isolation

设置隔离级别为可重复读的指令:

sql 复制代码
set session transaction isolation level repeatable read
相关推荐
PaperData27 分钟前
1988-2025年《中国人口和就业统计年鉴》全年份excel+PDF
数据库·人工智能·数据分析·经管
星河耀银海1 小时前
C语言与数据库交互:SQLite实战与数据持久化
c语言·数据库·sqlite·交互
过期动态1 小时前
MySQL中的约束
android·java·数据库·spring boot·mysql
程序员陆通1 小时前
月烧 400 刀到不到 20 刀:我是怎么把 OpenClaw 的 Token 账单砍掉 95% 的
java·前端·数据库
Shan12051 小时前
站在计算机领域视角看:SQL注入攻击
网络·数据库·sql
轻刀快马2 小时前
别干背八股文了:从一场“双十一秒杀”惨案,看懂 InnoDB 事务、锁与索引的底层齿轮
数据库·sql
万事大吉CC2 小时前
【1】Django 基础:MTV 架构与核心组件
数据库·架构·django
曾凡宇先生2 小时前
mysql局域网授权
数据库·mysql
xcLeigh3 小时前
IoTDB Rust 原生接口开发指南:从零生成 + 完整 RPC 调用
数据库·rpc·rust·接口·api·时序数据库·iotdb
努力努力再努力wz3 小时前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql