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

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

文章目录

  • 1、什么是事务
  • 2、事务的特性(ACID)
  • 3、并发事务带来的问题
  • 4、四个隔离级别:

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×××
http://www.lryc.cn/news/103408.html

相关文章:

  • 【Lua学习笔记】Lua进阶——Table(2)
  • 如何进行软件回归测试
  • php://filter绕过死亡exit
  • RS485/RS232自由转ETHERNET/IP网关profinet和ethernet区别
  • Hadoop_HDFS_常见的文件组织格式与压缩格式
  • 算法与数据结构(四)--排序算法
  • 【C/C++】C++11 在各编译器版本支持详情
  • flutter开发实战-图片保存到相册
  • 数据结构---栈
  • 【RabbitMQ】golang客户端教程1——HelloWorld
  • 计算机图形学笔记2-Viewing 观测
  • Redis - 三大缓存问题(穿透、击穿、雪崩)
  • web自动化测试-PageObject 设计模式
  • golang json.Marshal() 结构体、map 携带 符号 转成 “\u0026“
  • 【设计模式|行为型】备忘录模式(Memento Pattern)
  • Redis与其他缓存解决方案(如Memcached)的区别是什么?
  • 《面试1v1》Kafka的ack机制
  • 基于双 STM32+FPGA 的桌面数控车床控制系统设计
  • ES-5-进阶
  • Java面试准备篇:全面了解面试流程与常见问题
  • Go语言进阶语法八万字详解,通俗易懂
  • Apache RocketMQ 远程代码执行漏洞(CVE-2023-37582)
  • Kotlin Multiplatform 使用 CocoaPods 创建多平台分发库
  • 前端食堂技术周刊第 92 期:VueConf 2023、TypeChat、向量数据库、Nuxt 服务器组件指南
  • 用C语言构建一个手写数字识别神经网络
  • vue关闭ESlint
  • 测试开发人员如何进行局部探索性测试?一张图告诉你
  • CentOS 8 上安装 Nginx
  • 【c语言进阶】字符函数和字符串函数知识总结
  • DB2实现正则表达式