SQL内功笔记 · 第8篇:事务的四大特性与隔离级别

事务

SQL语句是我们给数据库发送了指令,让数据库帮我们做事情,可以理解为是让数据库做的事情。

事务的本质可以理解为:多线程并发操作同一张表格可能带来的安全问题。

1、开始事务 begin / start transaction

2、执行操作 select update delete insert ...

3、事务处理 commit、rollback


事务的四大特性

  • Atomicity(原子性)

    一个事务中的所有操作是一个整体,不可再分的,事务中的所有操作要么都成功,要么都失败。

  • Consistency(一致性)

    执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的。一个用户操作了数据,提交以后,另一个用户看到的数据与之前用户看到的效果是一致。

  • Isolation(隔离性)

    并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

  • Durability(持久性)

    事务一旦被提交,它对数据库的改变是永久性的,即使后续系统发生故障,已提交的数据也不会丢失。


隔离级别

  • READ-UNCOMMITTED (读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED (读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ (可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE (可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 简称 脏读 不可重复读 幻读
READ-UNCOMMITTED RU √ √ √
READ-COMMITTED RC × √ √
REPEATABLE-READ RR × × √
SERIALIZABLE S × × ×

MySQL数据库提供默认隔离级别 Repeatable Read 可重复读

Oracle数据库提供默认隔离级别 Read Committed

修改数据库中的隔离级别 set session transaction isolation level xxx

查看数据库中的隔离级别 SELECT @@transaction_isolation; (MySQL 8.0+) 或 SELECT @@tx_isolation; (MySQL 5.7及之前)


脏读(Dirty Read):事务 A 读取到事务 B 已修改但未提交的数据,事务 B 回滚后,事务 A 读到的数据变为无效。

不可重复读(Non-repeatable read) : 在一个事务的两次查询之中数据不一致,两次查询过程中间插入了一个事务更新删除了原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,中间有事务插入了几条数据。


总结

事务是数据库管理并发操作、保证数据一致性的核心机制。在开发中,应根据业务对数据一致性的要求与系统性能的承受能力,谨慎选择最低且足够的隔离级别,并善用短事务来减少锁竞争和提升并发性能。

相关推荐
想做小南娘,发现自己是女生喵15 分钟前
LAN Device Monitor 第二周学习文档
java·服务器·数据库
念何架构之路15 分钟前
Go reflect包值操作 Value 的读写、可设置性与 interface 布局
开发语言·后端·golang
小林ixn18 分钟前
用 FastAPI + SQLAlchemy 从零手搓一个博客系统:一套能落地、能讲清楚的 RESTful 后端
后端·python·fastapi
byte轻骑兵18 分钟前
【TextIn xParse + WorkBuddy】把8小时的标书审查压进1小时:招标要求逐条核验与废标风险预警工作台
大数据·数据库·aigc·textin·ai数据层基础设施
李永奉20 分钟前
杰理可视化SDK开发-音频录制功能使用教程
笔记·单片机·嵌入式硬件·mcu·物联网·音视频
翔云12345626 分钟前
Gaea(小米MySQL Proxy)整体架构
运维·数据库·mysql
不识君26 分钟前
esl-client 2.0.0 发布:Java 项目接入 FreeSWITCH,从引入到使用
spring boot·后端·开源
jaysee-sjc32 分钟前
【苍穹外卖】Day10:定时任务与 WebSocket 实时提醒实战
java·开发语言·javascript·数据库·vue.js·websocket·网络协议
ysu_031434 分钟前
【C++ 进阶之路】(二)从内联函数到类与对象:深挖内存对齐、this 指针与三大默认成员函数
开发语言·数据结构·c++·笔记·面向对象·this
叼烟扛炮39 分钟前
Linux 学习笔记(三十二):线程控制——创建、等待与分离
linux·运维·服务器·笔记·学习·1024程序员节