【MySQL】事务四大特性ACID、并发事务问题、事务隔离级别


🐌个人主页: 🐌 叶落闲庭

💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


MySQL

  • 一、事务四大特性ACID
    • [1.1 原子性](#1.1 原子性)
    • [1.2 一致性](#1.2 一致性)
    • [1.3 隔离性](#1.3 隔离性)
    • [1.4 持久性](#1.4 持久性)
  • 二、并发事务问题
    • [2.1 脏读](#2.1 脏读)
    • [2.2 不可重复读](#2.2 不可重复读)
    • [2.3 幻读](#2.3 幻读)
  • 三、事务隔离级别
    • [3.1 脏读演示](#3.1 脏读演示)
    • [3.2 不可重复读演示](#3.2 不可重复读演示)
    • [3.3 可重复读演示](#3.3 可重复读演示)

一、事务四大特性ACID

1.1 原子性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

事务是一组操作,这组操作是不可分割的最小操作单元,表示这组操作的内容要么全部执行成功,如果有一个操作没有成功,那么这组操作全部执行失败。

1.2 一致性

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

例如在进行转账操作时,一个账户给另一个用户转账,不管这个操作最终成功,还是因为转账失败回滚,最后这两个账户的余额相加都是一致的。

1.3 隔离性

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

隔离性指的是有若干个并发事务,比如有两个事务,事务1和事务2都在同时操作这个数据库,事务1去操作的时候不会影响并发的事务2的执行,事物2去操作的时候也不会影响并发的事务1去执行,这两个事务是在独立的环境下运行的。

1.4 持久性

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

数据库当中的数据最终是存放在磁盘当中的,一个事务不管是操作成功提交了还是操作异常回滚了,最终对数据库的改变是永久的保留到磁盘中的。

二、并发事务问题

2.1 脏读

  • 一个事务读到另外一个事务还没有提交的数据。

有两个并发执行的事物,事务A要进行select和update操作,事务B执行select操作,它们操作的是同一个数据库,当事务A执行完update操作还没有提交时,事务B进行了select操作,这时就查出了事务A将要修改但还没有提交修改的数据,这被称为脏读。

2.2 不可重复读

  • 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

有两个并发事务,事务A有4个操作,第一个操作是select(id=1)一个数据,事务A在进行第二个操作时,事务B对事务A第一次查询的数据进行了修改,并且提交了这次修改,接着事务A进行第三个操作,依然是select(id=1),与第一个操作一样,但这次查到的数据发生了改变,这就是不可重复读。

2.3 幻读

  • 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影"。

有两个并发事务,事务A进行了select(id=1)的操作,在提交前事务B进行了insert(id=1)的操作,并且提交完成,此时数据库当中已经有了id为1的数据,接下来事务A进行insert(id=1)的操作,此时会提示插入失败,因为事务B已经插入了id为1的数据,此时事务A再次进行select(id=1)的操作,但还是没有查到(已经解决了不可重复读的问题了),这就类似出现了幻觉,这个现象称之为幻读。

三、事务隔离级别

隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed(Oracle默认) ×
Repeatable Read(MySQL默认) × ×
Serializable × × ×
  • 查看事务隔离级别
sql 复制代码
SELECT @@TRANSACTION_ISOLATION;
  • 设置事务隔离级别
sql 复制代码
SET SESSION TRANSACTION ISOLATION LEVEL {Read uncommitted|Read committed|Repeatable Read|Serializable  } ;

3.1 脏读演示

  • Read uncommitted:


  • Read committed:


3.2 不可重复读演示



3.3 可重复读演示




相关推荐
神仙别闹几秒前
基于 QT(C++)实现操作系统
数据库·c++·qt
Broccoli5230266510 分钟前
FastAPI + SQLAlchemy 异步会话(AsyncSession)核心方法
数据库·oracle·fastapi
harmony&24 分钟前
MySQL 运维实战:从 DQL 查询到 MHA 高可用架构全解析
mysql
坐吃山猪43 分钟前
【多线程】FutureTask多线程底层实现
java·开发语言·数据库
weixin199701080161 小时前
[特殊字符]《从0到1:闲鱼开放平台授权登录 + AccessToken 刷新 + 聚石塔部署完整链路》(附Python源码)
java·数据库·python
cmes_love1 小时前
国内期货Level2五档行情与逐笔成交数据介绍
数据库·区块链
cmes_love1 小时前
CME和CBOT外盘期货数据下载资源介绍
数据库·区块链
Zenova EdgeOS1 小时前
工业边缘双写一致性:从缓存到多 DB 的工程实战
数据库·缓存·边缘计算·工业边缘
Meta392 小时前
Java八股文之Spring Boot 中解决 MySQL 和 Elasticsearch (ES) 的数据一致性问题
java·spring boot·mysql
志栋智能2 小时前
运维不再“猜谜”:自动化定界终结无效排查
运维·数据库·自动化