【数据库】事务(概念和特点)

数据库——事务

    • 一、 **什么是事务**:
    • 二、事务的特点:
    • 三、一个例子说明事物
    • 四、事务的隔离性
      • 4.1 五种并发异常
        • 4.1.1 第一类丢失更新
        • 4.1.2 第二类丢失更新
        • 4.1.3 脏读
        • 4.1.4 不可重复读
        • 4.1.5 幻读
      • 4.2 使用四种隔离级别去处理这五种并发异常
      • 4.3 事务管理的实现机制
        • 4.3.1 悲观锁(数据库自带的)
        • 4.3.2 乐观锁(自定义实现)
      • 4.4 Spring事务管理

一、 什么是事务

事务是在数据库中执行的一系列操作单元,这些操作要么全部成功提交,要么全部失败回滚。

二、事务的特点:

  • 原子性(Atomicity):事务是一个不可分割的操作单元,要么全部执行成功,要么全部执行失败。如果事务中的任何一部分操作失败,将回滚到事务开始前的状态,保证数据的完整性。
  • 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态到另一个一致性状态
  • 隔离性(Isolation):事务的执行互不干扰,任何事务内部操作对其他事务都是隔离的。并发执行的多个事务之间应该互相隔离,以防止数据争用和不一致的问题。
  • 持久性(Durability):一旦事务提交成功,它对数据库的改变应永久保存,即使系统发生故障也不会丢失。数据库系统通过将事务的操作记录写入持久存储介质(如磁盘)来保证数据的持久性。

三、一个例子说明事物

假设有一个银行系统,其中有两个账户:账户A和账户B。现在有一个转账操作需要将一定金额从账户A转移到账户B。

在这个转账操作中,可以将其作为一个事务来处理。事务包含以下步骤:

  1. 开始事务。
  2. 从账户A扣除一定金额。
  3. 向账户B添加同样的金额。
  4. 提交事务。

如果在整个过程中没有出现错误,即成功执行了步骤 2 和步骤 3,并且事务成功提交,那么账户A和账户B的余额将会根据转账操作进行更新,保持总额不变。

然而,如果在执行过程中出现了错误,比如步骤 3 遇到了问题,无法向账户B添加金额,那么事务将会回滚(Rollback),取消之前的步骤,账户A的金额也不会被扣除。

四、事务的隔离性

  • 五种常见的并发异常
    • 第一类丢失更新、第二类丢失更新
    • 脏读、不可重复读、幻读
  • 常见的隔离级别
    • Read Uncommitted: 读取未提交的数据
    • Read Committed: 读取已提交的数据
    • Repeatable Read: 可重复读
    • Serializable: 串行化

4.1 五种并发异常

4.1.1 第一类丢失更新

某一个事务的回滚,导致另一个事务已更新的数据丢失。

在这里插入图片描述

4.1.2 第二类丢失更新

某一个事务的提交,导致另一个事务已更新的数据丢失。
在这里插入图片描述

4.1.3 脏读

某一个事务,读取了另外一个事务未提交的数据。
在这里插入图片描述

4.1.4 不可重复读

一个事务对同一个数据前后读取结果不一致。

时间事务A事物B
T1开始事务
T2开始事务
T3查询账户余额为1000
T4取款1000,存款余额为0
T5查询账户余额为0

4.1.5 幻读

某一个事务,对同一个表前后查询到的行数不一致。

时间事务A事物B
T1开始事务
T2开始事务
T3查询账户余额小于10的用户(10人)
T4新增一账户且余额小于10
T5查询账户余额小于10的用户(11人)

4.2 使用四种隔离级别去处理这五种并发异常

隔离级别第一类丢失更新脏读第二类丢失更新不可重复读幻读
读未提交的数据YYYYY
读已提交的数据YYY
可重复读Y
串行化
  1. 数据安全性极高:串行化
  2. 性能高:读已提交的数据

4.3 事务管理的实现机制

4.3.1 悲观锁(数据库自带的)

看待问题悲观:只要并发就一定有问题

  • 共享锁(S锁)
    • 事务A对数据加了S锁后,其他事物只能加S锁,不能加X锁。即只能读、不能写
  • 排他锁(X锁)
    • 事物A对数据加了X锁后,其他事物对该数据不能加S锁也不能加X锁。即不能读、不能写

4.3.2 乐观锁(自定义实现)

乐观看待问题:即使并发了,也不会有问题

  • 版本号、时间戳
    • 在更新数据前,检查版本号是否发生变化。若变化则放弃本次更新,否则跟新数据(版本号+1)。

4.4 Spring事务管理

  • 声明式事务(开发中常用)
    • 通过XML配置,声明某方法的事务特征;
    • 通过注解,声明某方法的事务特征。
  • 编程式事务
    • 通过Transaction Template管理事务,通过它执行数据库操作。
 /* propagation为传播机制A调B,对于B来说,A为当前事务(外部事物)1. REQUIRED: 如果存在当前事务,那就加入该事务;如果不存在,就创建新事务;2. REQUIRED_NEW:创建一个新事务,并且暂停当前事务;3. NESTED:如果当前存在事务,则嵌套在该事物中执行(可独立地提交和回滚);否则和REQUIRED一样*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/95920.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技成果鉴定之鉴定测试报告

鉴定测试 由于软件类科技成果的复杂、内部结构难以鉴别等特点,我们提供了软件类科技成果鉴定测试服务。软件类科技成果鉴定测试是依据其科研项目计划任务书或技术合同书,参照相应的国家标准对要申请鉴定的软件类科技成果进行的一种符合性测试&#xff0…

数据结构(Java实现)-字符串常量池与通配符

字符串常量池 在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池。…

RealVNC配置自定义分辨率(AlmaLinux 8)

RealVNC 配置自定义分辨率(AlmaLinux8) 参考RealVNC官网 how to set up resolution https://help.realvnc.com/hc/en-us/articles/360016058212-How-do-I-adjust-the-screen-resolution-of-a-virtual-desktop-under-Linux-#standard-dummy-driver-0-2 …

MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

目录 0 存储引擎介绍1 SQL性能分析2 常见通用的JOIN查询 SQL执行加载顺序七种JOIN写法3 索引介绍 3.1 索引是什么3.2 索引优劣势3.3 索引分类和建索引命令语句3.4 索引结构与检索原理3.5 哪些情况适合建索引3.6 哪些情况不适合建索引4 性能分析 4.1 性能分析前提知识4.2 Expla…

【python爬虫】6.爬虫实操(带参数请求数据)

文章目录 前言项目:狂热粉丝分析过程什么是带参数请求数据如何带参数请求数据 代码实现被隐藏的歌曲清单什么是Request Headers如何添加Request Headers 复习 前言 先来复习一下上一关的主要知识吧,先热个身。 Network能够记录浏览器的所有请求。我们最…

Laravel 表单验证器的常用的2种使用方法

1、使用控制器的 validate 方法进行参数验证 场景一:前后端未分离 /*** 保存一篇新的博客文章。** param Request $request* return Response*/ public function store(Request $request) {$this->validate($request, [title > required|unique:posts|max:2…

Postgresql JSON对象和数组查询

文章目录 一. Postgresql 9.5以下版本1.1 简单查询(缺陷:数组必须指定下标,不推荐)1.1.1 模糊查询1.1.2 等值匹配1.1.3 时间搜索1.1.4 在列表1.1.5 包含 1.2 多层级JSONArray(推荐)1.2.1 模糊查询1.2.2 模糊查询 NOT1.2.3 等值匹配…

OpenCV(八):图像二值化

目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的…

c# 本地化中英文切换

区域 线程默认区域为当前计算机所选区域 设置当前区域: Thread.CurrentThread.CurrentCulture new CultureInfo(“zh-cn”); 获取当前区域: Console.WriteLine(Thread.CurrentThread.CurrentCulture.ToString()); 区域名称: “zh-cn” 中文…

解决 .csv 文件上传到 pgsql 的字符报错问题

目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时,报错显示如下: ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…

「黄钊的AI日报·第一季」免费试读!最后5天,早鸟价60元~

1、每天5条AI内容点:不是常见的新闻汇总模式,而是站在AI产品经理的视角,把每篇AI干货的最核心内容,直接拎出来、甚至用自己的话来描述,是在展示“what I see”,和原文已经不是一个东西了! 2、已…

独家首发!openEuler 主线集成 LuaJIT RISC-V JIT 技术

RISC-V SIG 预期随主线发布的 openEuler 23.09 创新版本会集成 LuaJIT RISC-V 支持。本次发版将提供带有完整 LuaJIT 支持的 RISC-V 环境并带有相关软件如 openResty 等软件的支持。 随着 RISC-V SIG 主线推动工作的进展,LuaJIT 和相关软件在 RISC-V 架构下的支持也…