[数据库]对数据库事务进行总结

文章目录

1、什么是事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

2、事务的特性(ACID)

  1. 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性: 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  3. 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

3、并发事务带来的问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

  • 事务 A、B 交替执行,事务 A 读取到事务 B 未提交的数据,这就是脏读。
  • 在第一个事务中的两次相同查询之间,由于第二个事务的修改导致第一个事务两次读取的数据不一样,这就是不可重复读
  • 事务 A 查询一个范围的结果集,另一个并发事务 B 往这个范围中插入 / 删除了数据,并静悄悄地提交,然后事务 A 再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

4、四个隔离级别:

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

MySQL 默认的事务隔离级别是可重复读 (Repeatable Read)。 我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;

隔离级别 脏读 不可重复读 幻影读
READ-UNCOMMITTED
READ-COMMITTED ×
REPEATABLE-READ × ×
SERIALIZABLE × × ×
相关推荐
YaoYuan93235 分钟前
Ubuntu22.04 中搭建基于 Qemu 的内核(驱动)开发环境
数据库
hans汉斯7 分钟前
【计算机科学与应用】基于多光谱成像与边缘计算的物流安全风险预警模式及系统实现
大数据·数据库·人工智能·设计模式·机器人·边缘计算·论文笔记
叫我龙翔15 分钟前
【MySQL】从零开始了解数据库开发 --- 如何理解事务隔离性
数据库·mysql·数据库开发
你想考研啊37 分钟前
一、redis安装(单机)和使用
前端·数据库·redis
枫叶丹442 分钟前
【Qt开发】多元素类控件(三)-> QTreeWidget
开发语言·数据库·c++·qt
洲覆1 小时前
Redis 驱动适配 Reactor 模式
开发语言·网络·数据库·redis
IDOlaoluo1 小时前
win64_11gR2_client.zip 怎么安装?Oracle 11g 客户端详细安装步骤
数据库·oracle
呆呆小金人1 小时前
SQL入门:别名使用完全指南
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
缘友一世1 小时前
Redis未授权访问漏洞:从原理到高级利用
数据库·redis·缓存
码农阿豪3 小时前
国产化替代新篇章:金仓数据库如何实现MongoDB平滑迁移
数据库·mongodb