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

什么是事务?隔离级别

一、什么是事务?

事务是代表单个工作单元的一组SQL语句,它确保这些语句要么全部成功,要么全部失败回滚。(想象一下,你去银行转账。你要把一笔钱从一个账户(账户A)转到另一个账户(账户B)。这个转账过程可以看作是一个事务。)

事务具有四个特征:原子性、一致性、隔离性和持久性。这四个特征通常称为ACID

二、事务的四个特征(ACID)

原子性:事务中的所有操作要么全部完成,要么全部不完成。(转账过程中,如果第一个操作(从账户A扣钱)成功了,但第二个操作(加到账户B)失败了,那么整个转账就不算成功。银行需要把第一个操作撤销,也就是把你账户A的钱再加回去。这就是原子性,要么两个操作都成功,要么都不成功。)

一致性:事务完成后,数据库必须从一个一致状态转化到另一个一致状态。(转账前后,你的总金额应该是不变的。如果你从账户A转了100元到账户B,那么转之前和转之后,账户A和账户B的总金额应该是一样的。事务确保了这个一致性)

隔离性:一个事务的执行不应影响其他事务的执行。(当你在做转账的时候,其他人也在做转账。你的转账操作不应该影响到别人的转账,别人的也不应该影响到你的。每个转账操作都是独立的,这就是隔离性。)

持久性:一旦事务提交,其结果应该永久保存在数据库中,即使系统发生故障。(一旦转账成功,这笔交易就不能再被撤销了,即使银行系统突然断电或者出现故障。这就是持久性,一旦事务提交,它的效果就是永久的。)

三、什么是脏读、不可重复读、幻读?

1.脏读:

脏读是指一个事务读取了另一个事务未提交的数据。如果那个事务后来回滚了,那么读到的数据就是无效的,就像是读到了一个“脏”的数据。

(举例:假设你在查看商品库存,另一个工作人员正在更新库存数据但还没完成。你看到的库存数量是那个工作人员还没改完的数字,然后那个工作人员取消了操作,你读到的库存数量就不准确了。)

2.不可重复读:

不可重复读是指在一个事务内,多次读取同一数据集合时,由于其他事务的介入,读取的结果不一致。

(举例:你第一次查看商品价格是100元,然后你再次查看同一个商品的价格,由于另一个工作人员已经更新了价格,你看到的变成了110元。这就是不可重复读,因为同一个事务中两次读取的结果不一致。)

3:幻读:

幻读是指在一个事务内,两次执行查询时,由于其他事务的插入或删除操作,返回的记录数不一致,就像是出现了“幻影”。

(举例:你在统计某类商品的总数,第一次统计是100件,然后你再次统计,由于另一个工作人员在此期间添加了新商品,你看到的总数变成了105件。这就是幻读,因为两次查询的结果不一致,而且这种不一致是由于其他事务新增或删除记录造成的。)

四、SQL的四个隔离级别

读已提交(Read Uncommitted):

 一个事务能够读取到别的事务中没有提交的更新数据。事务中的修改,即使没有提交,其他事务也可以看得到。在这种隔离级别下有可能发生脏读,不可重复读和幻读

读未提交(Read Committed)

事务中的修改只有提交以后才能被其它事务看到。在这种隔离级别下解决了脏读,但是有可能发生不可重复读和幻读。

不可重复读(Repeated Read):

保证了在同一事务中先后执行的多次查询将返回同一结果,看到的每行的记录的结果是一致的,不受其他事务的影响。但是这种级别下有可能发生幻读。

可串行化(Serializable)
        不允许事务并发执行,强制事务串行执行。就是在读取的每一行数据上都加上了锁,读写相互都会阻塞,所以效率很低下。这种隔离级别最高,是最安全的,但是性能最低,不会出现脏读,不可重复读,幻读。

以上就是对事务的一些基础的理解,希望对大噶获有用!


http://www.kler.cn/a/447299.html

相关文章:

  • PHP 微信棋牌开发全解析:高级教程
  • 强基计划之编程:开启科研精英培养新路径
  • 靜態IP與DHCP的區別和用法
  • 数据结构大作业——家谱管理系统(超详细!完整代码!)
  • 「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
  • 【libuv】Fargo信令1:client发connect消息给到server
  • 嵌入式单片机中外设的基本控制与实现
  • 游戏开发技能系统常用概念
  • Kafka 迁移 AutoMQ 时 Flink 位点管理的挑战与解决方案
  • 基于Spring Boot的智慧农业专家远程指导系统
  • 如何使用 Python 连接 MySQL 数据库?
  • Websocket客户端始终连接不上Server排查之Openai Realtime api
  • 基于 STM32 的多路火灾报警系统设计
  • LeetCode hot100-91
  • 高性能MySQL-查询性能优化
  • 标准库与HAL库的区别
  • 常用的缓存技术都有哪些
  • CodeSurfer 介绍
  • 青少年编程与数学 02-004 Go语言Web编程 08课题、使用Gin框架
  • 雅思真题短语梳理(一)
  • 9596 回文数 存档40%
  • 使用Electron获取用户信息,监听程序打开,用户退出连接关闭程序【全代码,有图】
  • Redis应用缓存框架
  • Spring如何解决bean的循环依赖
  • centos stream 8下载安装遇到的坑
  • 方正畅享全媒体新闻采编系统 reportCenter.do SQL注入漏洞复现