数据库事务详解

2023-11-11

概述

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。
* ACID
事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称ACID。

  • 隔离级别
    ACID这4个特征中,最难理解的是隔离性。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。4个隔离级别分别是:读未提及(READ_UNCOMMITTED)、读已提交(READ_COMMITTED)、可重复读(REPEATABLE_READ)、顺序读(SERIALIZABLE)。

  • 事务并发引起的问题
    数据库在不同的隔离性级别下并发访问可能会出现以下几种问题:脏读(Dirty Read)、不可重复读(Unrepeatable Read)、幻读(Phantom Read)。

事务的思维导图

ACID

1. 原子性(Atomicity)

事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一。
* 全部执行成功
* 全部执行失败

任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。

2. 一致性(Consistency)

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。

比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱。

3. 隔离性(Isolation)

事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。

一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。

隔离性分4个级别,下面会介绍。

4. 持久性(Duration)

事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。

事务隔离级别

1. 读未提及(READ_UNCOMMITTED)

读未提及,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。

脏读示例:

在事务A和事务B同时执行时可能会出现如下场景:

时间 事务A(存款) 事务B(取款)
T1 开始事务 ——
T2 —— 开始事务
T3 —— 查询余额(1000元)
T4 —— 取出1000元(余额0元)
T5 查询余额(0元) ——
T6 —— 撤销事务(余额恢复1000元)
T7 存入500元(余额500元) ——
T8 提交事务 ——

余额应该为1500元才对。请看T5时间点,事务A此时查询的余额为0,这个数据就是脏数据,他是事务B造成的,很明显是事务没有进行隔离造成的。

2. 读已提交(READ_COMMITTED)

读已提交是不同的时候执行的时候只能获取到已经提交的数据。
这样就不会出现上面的脏读的情况了。

不可重复读示例

可是解决了脏读问题,但是还是解决不了可重复读问题。

时间 事务A(存款) 事务B(取款)
T1 开始事务 ——
T2 —— 开始事务
T3 —— 查询余额(1000元)
T4 查询余额(1000元) ——
T5 —— 取出1000元(余额0元)
T6 —— 提交事务
T7 查询余额(0元) ——
T8 提交事务 ——

事务A其实除了查询两次以外,其它什么事情都没做,结果钱就从1000编程0了,这就是不可重复读的问题。

3. 可重复读(REPEATABLE_READ)

可重复读就是保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别进制了不可重复读取和脏读,但是有可能出现幻读的数据。

幻读

幻读就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。

时间 事务A(统计总存款) 事务B(存款)
T1 开始事务 ——
T2 —— 开始事务
T3 统计总存款(1000元) ——
T4 —— 存入100元
T5 —— 提交事务
T6 提交总存款(10100) ——
T7 提交事务 ——

银行工作人员在一个事务中多次统计总存款时看到结果不一样。如果要解决幻读,那只能使用顺序读了。

4. 顺序读(SERIALIZABLE)

顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。

事务隔离级别对比

事务隔离级别 脏 读 不可重复读 幻 读
读未提及(READ_UNCOMMITTED) 允许 允许 允许
读已提交(READ_COMMITTED) 禁止 允许 允许
可重复读(REPEATABLE_READ) 禁止 禁止 允许
顺序读(SERIALIZABLE) 禁止 禁止 禁止

4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。
一般数据默认级别是读以提交或可重复读。


想了解更多精彩内容请关注我的公众号

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库事务详解 的相关文章

随机推荐

  • Pycharm连接MySQL后出现不出现数据库或表,出现其他文件的问题

    在使用pycharm连接MySQL 配置完成 测试连接通过之后 还是不能显示数据库中的表 出现了许多像armscii8 bin armscii8 general ci和ascii bin等的文件 解决方法是 回到数据库设置页面 在Schem
  • .NET6 using

    在 net 6 的应用程序中 using 语句去了哪里 net 5 中 using 语句直接写在文件顶端就可以了 但是在 net 6 中 main函数被隐式的执行 文件最顶部也找不到 using 指令了 找了找其他文件 发现在obj gt
  • WebSocket connection to 'ws://xxxxxx/ws/' failed: Unexpected response code: 502

    在使用reactJs开发一个项目的时候在适配Android的时候遇到这个问题 首先 前提是这个webscoket地址是可以使用的 并且在电脑浏览器上是可以正常的 其次 Android7 0以上的原生浏览器上是正常的 国内其他机型自带浏览器不
  • CentOS7 创建用户及更改其属组与属主(账户管理与权限)

    CentOS 7 是一个广泛使用的 Linux 发行版 基于源代码 Red Hat Enterprise Linux RHEL 它以其稳定性 安全性和长期支持而闻名 以下是 CentOS 7 的一些主要功能 1 内核 CentOS 7 使用
  • 43道JavaScript面试题

    1 下面代码的输出是什么 function sayHi console log name console log age var name Lydia let age 21 sayHi 复制 A Lydia 和 undefined B Ly
  • go.mod提示 Unresolved reference 错误解决

    问题 go mod 文件中引入的路径都变红 导入包失败 解决 启动 Enable Go modules integration
  • 驱动程序之_1_字符设备_4_fasync机制

    驱动程序之 1 字符设备 4 fasync机制 fasync机制是异步通知机制 当驱动程序向应用程序发送信号量 触发应用程序的信号处理函数 以达到类似中断的效果 驱动程序中 1 在文件专属的fasync函数中 调用了fasync helpe
  • (五) 空间查询

    Chapter 5 Spatial Queries 译 章节5 空间查询 The raison d etre of spatial databases is to perform queries inside the database wh
  • 密码正确登入不了网络计算机,windows远程登录密码正确但登录不上

    1 第一种情况 安全策略问题 开始 gt 运行 gt gpedit msc gt 计算机配置 gt Windows设置 gt 安全设置 gt 本地策略 gt 安全选项 gt 网络访问 本地帐户的共享和安全模型 修改为使用经典模式 2 第二种
  • 目标检测——R-CNN网络基础

    目录 Overfeat模型 RCNN模型 算法流程 候选区域生成 CNN网络提取特征 目标分类 SVM 目标定位 预测过程 算法总结 Fast RCNN模型 算法流程 ROI Pooling 目标分类和回归 模型训练 模型总结 Overfe
  • vue 后台管理系统引入地图选点插件获取经纬度

    地图插件文档 https elemefe github io vue amap 下载引入插件 npm install save vue amap 在main全局引用插件 引入vue amap import VueAMap from vue
  • Anconda中创建了虚拟环境,安装了各种第三方库,但是pycharm中却不会使用的解决办法

    解决方法 打开Pycharm gt File gt Settings gt Project Interpreter gt 左键点击add 按照1 2 3的顺序进行点击 Conda executable不需要管 找到安装Anaconda的盘
  • IBM HR Analytics 员工流失 EDA 和可视化绩效分析

    IBM HR Analytics 员工流失与绩效分析 背景 导入库 输出前五行 数据清洗 检查空值 删除不必要的列 可视化 商务旅行直方图 离家的距离箱形图 教育与数字公司的关系 年龄和月收入散点图 按教育领域和工作角色划分的工作满意度 相
  • 使用 Ray 将 PyTorch 模型加载速度提高 340 倍

    导读 在应用中使用深度学习的挑战之一是管理加载模型进行推理的成本 在本文中 我们将展示如何利用 PyTorch 和 Ray 的功能将这一成本几乎降至零 Introduction 深度学习模型庞大而繁琐 由于它们的大小 它们需要很长时间才能加
  • 数据挖掘项目:银行信用评分卡建模分析(上篇)

    kaggle上的Give Me Some Credit一个8年前的老项目 网上的分析说明有很多 但本人通过阅读后 也发现了很多的问题 比如正常随着月薪越高 违约率会下降 但对于过低的月薪 违约率却为0等 因此 本人写这个项目的目的是按照自己
  • 使用docker搭建部署hadoop分布式集群

    http blog csdn net xu470438000 article details 50512442 使用docker搭建部署hadoop分布式集群 标签 dockerhadoop集群 2016 01 13 18 16 2005人
  • 单JS心跳网站初稿

    客户端定时向服务端请求数据 根据返回数据作出相应的处理 客户端按用户操作向服务端发送用户操作数据 服务端根据每个客户端生成数据集 保存到数据库 服务端根据客户端发送过来的用户操作数据生成操作列表 服务端根据操作列表逐个生成不同的心跳包返回给
  • C++中智能指针详解

    1 问题引入 在C 中 静态内存和栈内存外 还有一部分内存称为堆程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码必须显式的销毁它们 在C 中一般使用 new 在动态内存中为对象分配一块空间并返回一个
  • 【猛地学】Vue2基础学习笔记(尚硅谷vue2)

    vue2基础 vue实例和容器
  • 数据库事务详解

    概述 事务 Transaction 是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元 ACID 事务具有4个基本特征 分别是 原子性 Atomicity 一致性 Consistency 隔离性 Isolation 持久