你真的把数据库事务搞懂了吗,有图有真相,图文并茂!

2023-11-18

数据库事务

数据库事务( transaction)是访问,并可能操作各种数据项的,一个数据库操作序列,这些操作要么,全部执行,要么,全部不执行,是一个不可分割的,工作单位。事务由事务开始,与事务结束之间执行的,全部数据库操作组成。

比如,我们去银行转账,操作可以分为下面两个环节:
(1)从第一个账户划出款项。
(2)将款项存入第二个账户
在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,也就是说,第一个账户转出去的钱要回到第一个人的账户中,称为数据回滚,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。
在这里插入图片描述
在这里插入图片描述

jdbc事务

  • 数据一旦提交,就不能再回滚。
  • 数据什么时候意味着提交?
    • 当对象被创建时,默认情况自动提交事务:每次执行一个 SQL 语句,如果执行成功,就会向数据库自动提交,而不能回滚。
    • 关闭数据库连接,数据自动的提交。如果是多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
  • jdbc中为了可以让多条数据作为一个事务同时提交,我们三个方法必须要知道
方法名 描述
setAutoCommit(false) 取消自动提交事务
commit() 提交事务
rollback() 回滚事务

事务的ACID

在这里插入图片描述

1.原子性(Atomicity) 操作要么都发生,要么都不发生。 在这里插入图片描述
过程:
1、小明:1000-200=800
2、小红:1000+200=1200
原子性表示:不能小明转账了小红没收到,或者小红账上多了200,而小明账上没减少,二者是同时发生的。

2.一致性(Consistency) 事务前后数据完整性保持一致 在这里插入图片描述
一致性体现:
1、操作前:小明:1000 小红:1000
2、操作后:小明:800 小红:1200
也就是说这两人操作前后,两个人钱的总数相加都是2000

3.隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰。就像是两个人走路,你走你的,我走我的,当然了像男女朋友走路手拉着手就刚好是反例,恰恰是两个事务没有隔离
在这里插入图片描述隔离性体现
事务1:操作前:A:200 B:100
操作后 A:100 B:200
事务2:操作前:C:300 D:400
操作后:C:500 D:200

4.持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变,就是永久性的,接下来的其他操作不对之前的操作造成影响。
在这里插入图片描述在这里插入图片描述

数据库的并发

  1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这个修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后还使用了这个数据。

  2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,所以称为是不
    可重复读

  3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象
    发生了幻觉一样。

数据库的四种隔离级别

隔离级别 脏读 不可重复 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)
  • Oracle 支持的 2 种事务隔离级别:read-committed, serializable。
    Oracle 默认的事务隔离级别为: read-committed(不可重复读) 。

  • Mysql 支持 4 种事务隔离级别。
    Mysql 默认的事务隔离级别为: repeatable-read(可重复读)

  • 为什么数据库的隔离级别默认是可重复读?
    1.主从复制,是基于什么复制的?
    是基于binlog复制的
    2.binlog有几种格式?
    statement:记录的是修改SQL语句
    row:记录的是每行实际数据的变更
    mixed:statement和row模式的混合

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

你真的把数据库事务搞懂了吗,有图有真相,图文并茂! 的相关文章

  • 按每月时间为用户标记标签

    数据源 User ID Visit Date 1 2020 01 01 12 29 15 1 2020 01 02 12 30 11 1 2020 04 01 12 31 01 2 2020 05 01 12 31 14 Problem 我
  • 字符串文字上的 SQL Server T-SQL N 前缀[重复]

    这个问题在这里已经有答案了 这可能是一个菜鸟问题 但我发现了一些 T SQL 查询示例来验证数据库大小SELECT and WHERE clause here http technet microsoft com en us library
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 存储过程总是返回0

    我试图从存储过程获取返回值 但它总是返回 0 c code cmd new SqlCommand cmd CommandType CommandType StoredProcedure cmd CommandText AbsentEntry
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 数据库级别的别名列名 [MySQL]

    别名 可能是错误的词 因为它是在将列 表名称作为查询中的其他名称引用的上下文中使用的 我感兴趣的是是否有一种方法可以在数据库中为列指定两个名称 如果我要打印这样的表格 它看起来会是这样的 mysql gt SELECT FROM User
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • 如何使用sql脚本更改列的属性

    如何使用 sql 脚本更改列的属性 这是我尝试过但出现错误的方法 ALTER TABLE dbo tblBiometricPattern COLUMN BiometricPatternID TINYINT NOT NULL IDENTITY
  • 如何在Oracle中从表中选择列,*?

    我正在创建很多脚本 有时为了检查表是否根据我的需要进行更新 我会即时编写几个 SELECT 语句 在 SQL SERVER 中你可以这样写 SELECT Column1 FROM MY TABLE 出于可见性原因 这很有用 但是这似乎在 O
  • 通过Java从MySQL中获取大量记录

    有一个 MySQL 表 服务器上的用户 它有 28 行和 100 万条记录 也可能会增加 我想从这个表中获取所有行 对它们进行一些操作 然后将它们添加到 MongoDB 中 我知道通过简单的 从用户中选择 操作来检索这些记录将花费大量时间
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • MySQL 最佳实践:SELECT 子递归尽可能提高性能?

    我想选择一个根项目及其子项 使其性能尽可能高 我更喜欢使用嵌套集模型 但这次表结构遵循邻接模型 有关嵌套集和邻接模型的更多信息 http mikehillyer com articles managing hierarchical data
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • sql server 2008 对 exec 语句的限制

    我只需要仔细检查 t sql 中的 EXEC 命令是否有字符限制 如果我有一个带有 varchar max 的变量并使用 EXEC 执行命令 你认为这样可以吗 thanks 应该没问题 根据这篇 MSDN 文章 http msdn micr
  • 将图像列保存到 SQL Server 2000 中的文件

    我在 SQL Server 2000 中有一个包含图像列的表 我需要将图像数据保存到文件系统上的文件中 在 SQL Server 2005 中 我可以使用 ADODB Stream 对象进行文件 I O 但这在 SQL Server 200
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • 删除重复的行并需要在mysql中保留所有行中的一个[重复]

    这个问题在这里已经有答案了 我想删除基于两列的重复行 但需要保留所有行 1 行 重复行可以多于两行 例如 ID NAME PHONE 1 NIL 1234 2 NIL 1234 3 NIL 1234 4 MES 5989 我想从上面 3 行
  • 合并sql中的列

    我正在使用 SQL Server 2017 有一个存储过程 其中我有一个带有连接的简单选择 例如 SELECT p legacyKey AS JobNumber p Name AS JobName G Label AS DesignStat
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced

随机推荐

  • ffmpeg推流参考文章

    https www cnblogs com leisure chn p 10623968 html https www bilibili com read cv12294853 基于M3568平台移植nginx https z zlg cn
  • Docker笔记:基本概念、镜像、容器、仓库以及数据卷的使用

    什么是docker docker 是一个开源的应用容器引擎 可以使用docker将应用程序和依赖打包到一个镜像之中 可以非常方便的移植到其他机器上运行 使用docker构建打包我们的应用 build 之后可以像集装箱一样很方便的传输到别的机
  • 【Learning PGM in R】第一章 概率推理

    目录 1 1机器学习 1 1 1监督学习 1 1 2无监督学习和强化学习 1 2概率表示 1 2 1概率计算和随机变量 1 2 2条件概率 联合概率分布和边缘分布 1 3贝叶斯规则 1 4概率图模型基础 1 4 1概率图模型基础理论 1 4
  • 使用Kalman滤波器做目标跟踪

    https www mathworks com help vision examples using kalman filter for object tracking html 由该例整理而来 1 前言 2 介绍 3 目标跟踪的挑战 4
  • Vue2屎山代码大盘点

    前言 相比其他的框架来说 Vue中更容易产出屎山代码 因为Vue中的options就是一个大对象 导致js本身的很多检测都失效了 比如一个函数没有用到的话会 变灰 template中代码提示比较少 较多的mixins等等 遇到屎山代码 大多
  • 【JEECG技术博文】简单实例讲解JEECG ONLINE表单权限控制(jeecg3.6)

    简单实例讲解JEECGONLINE表单权限控制 jeecg3 6 原文 http blog itpub net 30066956 viewspace 1872409 相关博文 http blog itpub net 30066956 vie
  • Atcoder beginner contest 301

    A Overall Winner AC代码 include
  • CVE -2022-26134漏洞复现(Confluence OGNL 注入rce漏洞)

    0x01 Atlassian Confluence Atlassian Confluence是一个专业的企业知识管理与协同软件 主要用于公司内员工创建知识库并建立知识管理流程 也可以用于构建企业wiki 其使用简单 但它强大的编辑和站点管理
  • SpringBoot关于List集合的校验

    1 List集合失效的校验 PostMapping saveBatch ApiOperation 批量保存 LogOperation 批量保存 public Result saveBatch RequestBody Validated Li
  • vue项目 公众号授权

    第一步 获取后台给的跳转链接 获取链接 getAuth this http post this api wxGongAccount this qs stringify access token this token then res gt
  • with recursive ——《寻找没有被执行的任务对》LeetCode Plus 会员专享题【详细解析】Hive / MySQL

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 另外也欢迎大家关注我的SQL刷题专栏 里面有我分享的高质量
  • SRS文档

    主要负责人 王希敏201303014099 http www cnblogs com wangximin 日历记事本的用例建模 一 以现实世界中日历中的便签 或记事本等为原型 我们平常所使用的日历 每页都会留有一些空白的部分 用来记录当日
  • 电脑一开机,内存爆满90%以上

    我的是联想电脑 电脑一开机 内存爆满 然后打开任务管理器 并没有显示任何的应用程序所占内存较大 我然后又去打开杀毒软件 关闭电脑自动更新 都没有效果 最后 解决的办法是运行window 内存诊断 最后100 之后重启成功
  • 历次改革学习-20220816

    通过分税制改革 中央政府实现了政治上和经济上的集权 必须指出的是 土地和房地产问题后来发展到如此严峻的程度 也是1994年分税制的结果 因为分税制事实上把土地支配权给了地方政府 地方政府也各显神通 发展出包括地方融资平台在内的各种推动地方发
  • Java代码质量评估工具

    概述 Java代码的质量评估主要包括代码的可维护性 健壮性 以及在运行时能达到既定的性能目标 可维护性主要包括代码的可读性 在关键的代码上提供详细注释 在设计类或方法以及代码逻辑时符合设定的编码规范 健壮性主要包括编写代码时应使用常用的设计
  • Spring系列之@Aspect中5中通知详解

    Aspect中有5种通知 Before 前置通知 在方法执行之前执行 Aroud 环绕通知 围绕着方法执行 After 后置通知 在方法执行之后执行 AfterReturning 返回通知 在方法返回结果之后执行 AfterThrowing
  • Java EE企业级-第1章 Spring的基本应用

    第1章 Spring的基本应用 重点 ApplicationContext容器使用 属性setter方法注入的实现 Spring中的IoC和DI Spring Spring是分层的JavaSE EE full stack 轻量级框架 以Io
  • Mockito 如何 mock 静态方法

    在实际工作当中 我们经常会遇到需要对静态方法进行 mock 的情况 在 mockito 2 x 的时代 我们需要借助 powmock 才能实现 当 mockito 进化到了 3 4 0 版本以后 也开始对静态方法 mock 进行了支持 主要
  • 组装台式计算机需要哪些配件,组装一台电脑需要哪些配件【详细列举】

    电脑是我们生活中常见的电子产品 尤其是台式机是我们大家常用的工具 而对于电脑而言大部分朋友都是不陌生的 因为电脑在我们平时生活中是经常使用的 但是对于购买电脑的时候 很多朋友都会觉得商场的电脑总是不符合我们心意 这个时候组装电脑就是非常有需
  • 你真的把数据库事务搞懂了吗,有图有真相,图文并茂!

    数据库事务 数据库事务 jdbc事务 事务的ACID 数据库的并发 数据库的四种隔离级别 数据库事务 数据库事务 transaction 是访问 并可能操作各种数据项的 一个数据库操作序列 这些操作要么 全部执行 要么 全部不执行 是一个不