【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

⭐️前面的话⭐️

本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍有关数据库事务的特点以及隔离级别。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年5月20日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《无》
💬参考在线编程网站:🌐牛客网🌐力扣🌐acwing
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

  • 1.事务的基本特性
    • 1.1事务的概念
    • 1.2事务的使用
  • 2.数据库的隔离级别
    • 2.1并发操作的时候的问题
      • 2.1.1脏读
      • 2.1.2不可重复读
      • 2.1.3幻读
      • 2.1.4丢失更新
    • 2.2事务的隔离级别
      • 2.2.1读未提交
      • 2.2.2读已提交
      • 2.2.3可重复读
      • 2.2.4串行化执行
      • 2.2.5总结


封面


1.事务的基本特性

1.1事务的概念

事务诞生的目的就是将多个独立的操作视作一个整体,要么全部执行,要么全部不执行。

事务的四大特性:ACID

  • 原子性:对于一个事务中的所有操作要么全部执行,要不都不执行。事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须回滚,数据库状态应该退回到执行事务前的状态。
  • 一致性:事务执行之前与执行之后都是合理合法的,例如转账,转账支出与转账收入应该相当。
  • 持久性:事务提交之后,数据写入硬盘,无论你重启程序还是关机,数据依然存在。
  • 隔离性:隔离性描述的是并发执行的时候,出现的情况。

并发执行事务带来的问题:

1.2事务的使用

第一步,开启事务

start transaction;

第二步,执行多条sql语句

# 若干条sql语句

第三步,提交或回滚事务
如果想要完成事务的提交使用commit,想要完成事务的回滚使用rollback

commit/rollback;

2.数据库的隔离级别

2.1并发操作的时候的问题

2.1.1脏读

脏读指的是事务A读到了另外一个事务B未提交的数据,如果事务B发生了回滚,就会造成事务A获取到的数据是脏数据,这就是脏读。

下面来举一个例子说明,账户余额一开始为800,事务A表示有人转入了100元到账户,事务B表示转出300元但失败了,最终账户余额为900才是合理的,但是如果事务A读取到事务B未提交的数据,就会发生错误,这就是脏读可能会造成的危害。

1

事务A表示转入100元,但是事务B转出操作失败了,但事务A读取到了事务B未提交的数据,导致最终账户余额多扣了300元,事务A读取到事务B未提交的数据,这就是脏读。

2.1.2不可重复读

不可重复读其实和脏读有一点像,脏读读到的是另外一个事务未提交的数据,不可重复读,它读到的是另外一个事务已经提交的数据,造成读取的值不一致的情况。

展开来说就是,事务A读取了某一数据,然后事务B将该数据修改并提交了,事务A再次又读了该数据,但是得到的结果与上一次结果不同,这种现象就是不可重复读。

举个例子,一开始账户余额为500,事务A读取余额为500,然后事务B将钱转出了300元,余额变为200,事务A再次查询余额得到200元,在同一事务中,由于读取到另外一个事务提交的数据发生与第一次数据读取不一致的情况即不可重复读现象。

2

事务A首先查询到账户余额为500元,然后事务B转出余额300元,导致余额变为200元,事务A再一次查询,得到的查询结果发生了变化,变成200元了,这种读取相同数据不一致的现像,就是不可重复读。

2.1.3幻读

幻读即事务A第一次查询到数据表中符合要求的结果有n条,然后事务B插入了若干条数据,最后事务A再次同一调条件进行查询,符合要求的结果为m条,同一事务中,多次查询到合法数据结果不一致的现象就是幻读现象。

举个例子,一开始在用户表中事务A查询到了有3个名叫张三的人,然后事务B向数据库注册了一批新用户,事务A又查询了名叫张三的人,发现查询结果有6条,这就是幻读现象。
3

事务A首先查询张三有3人,然后事务A执行其他业务的时候,事务B注册了一批新用户,最后事务A再次查询张三的时候,出现了6人,这种在同一事务同样条件查询结果不一致的情况,即幻读。

2.1.4丢失更新

当两个或多个事务操作同一个数据表的时候,可能会发生一个事务没有感应到另外一个事务的更新操作,二造成更新出现错误的现象。

4
两个事务均进行更新操作,相互影响,某一事务撤销影响最终结果的准确性。

5
事务B覆盖了事务A的更新,影响最终结果的准确性。

这几种情况在并发的条件下都有可能造成不利后果,如脏读会导致转账的数目不对,不可重复读和幻读都可能会造成最终统计的结果不可靠,第一,二类更新丢失都会造成账户余额更新出现致命错误。

2.2事务的隔离级别

数据库并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能是致命的,数据库通常会通过锁机制来解决数据并发访问问题,按锁对象不同分为表级锁和行级锁;按并发事务锁定关系分为共享锁和独占锁。直接使用锁非常麻烦,为此数据库为用户提供了自动锁机制,用户指定会话的事务隔离级别,数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对用户来讲都是透明的。

简单说,鱼和熊掌不可兼得,速度和可靠性总得有牺牲,为了解决并发时,因地制宜,数据库设置了不同的几种隔离级别,让程序员自己根据实际情况选择一个最佳的事务隔离级别。

数据库事务隔离级别一共有四种,读未提交,读已提交,可重复读,串行化执行,并发程度依次降低,最后一种其实就没有了并发的特性了,但是串行化执行确实是最安全可靠的。

事务的隔离级别如下:

  • 读已提交 READ_COMMITTED
  • 读未提交 READ_UNCOMMITTED
  • 可重复读 REPEATABLE_READ
  • 串行化 SERIALIZABLE
  • 默认值 DEFAULT: (MySQL: 可重复读、Oracle: 读已提交)

2.2.1读未提交

读已提交( READ_UNCOMMITTED)指的是一个事务能够读取到另外一个事务未提交的数据,脏读,不可重复读,幻读,两类数据丢失更新都有可能发生,但大部分数据库在该事务隔离级别下会使用加锁去避免第一类丢失更新问题。

2.2.2读已提交

读已提交(READ_COMMITTED)指的是一个事务只能等另外一个更新事务提交数据后才能读取数据,保证事务读取的数据一定是已提交的数据,避免了脏读的问题,但是不可重复读和幻读问题依然存在,两类数据丢失更新都有可能发生,但大部分数据库会使用锁机制避免了第一类丢失更新问题。

Oracle等大部分数据库默认隔离级别。

2.2.3可重复读

可重复读(REPEATABLE_READ)指的是一个事务读取某数据时,其他的事务都不能修改该条数据,保证并发时,对于某一行数据,读取到的结果都是一样的,这样就解决了脏读,不可重复读的问题,但由于事务读取数据时,还能插入数据,所以幻读问题依然存在。其实两类数据丢失更新仅仅靠隔离级别的隔离逻辑分析还是会发生,但大部分数据库在可重复读的隔离级别下保证不会发生两类丢失更新的情况。

MySQL默认隔离级别。

2.2.4串行化执行

串行化(SERIALIZABLE)指的是一个事务执行完才能执行另外一个事务,即按照顺序执行,没有并发性,因为效率低,一般不采用该隔离级别。脏读,不可重复读,幻读均不会发生,数据库保证了在该隔离级别下,两种丢失更新不会发生。

四种隔离级别只能解决脏读,不可重复读,幻读三类读取的问题,丢失更新的问题需要靠加锁来解决,仅靠隔离级别是无法解决的。

2.2.5总结

隔离级别和可能发生的现象总结如下:

隔离级别脏读不可重复读幻读第一类丢失更新第二类丢失更新
未提交读允许允许允许不允许允许
读写提交不允许允许允许不允许允许
可重复读不允许不允许允许不允许不允许
串行化不允许不允许不允许不允许不允许

注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。所以应该根据实际情况选择事务的隔离级别。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++ STL】 趣学stackqueuepriority_queue【对话情景版】

文章目录 📍前言C STL 之 stack&queue基础知识及其模拟实现📍容器适配器🎈什么是适配器?🎈STL标准库中stack和queue的底层结构🎈deque的简单介绍(了解)📌deque的原理介绍📌deque…

Python学习27:存款买房(A)

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 你刚刚大学毕业,…

基于Hebb学习的深度学习方法总结

基于Hebb学习的深度学习方法总结 0 引言1 前置知识1.1 Hebb学习规则1.2 Delta学习规则 2 SoftHebb学习算法2.1 WTA(Winner Take All)2.2 SoftHebb2.3 多层Hebb网络2.4 Hebb学习的性能测评 3 参考文献 0 引言 总所周知,反向传播算法(back-propagating, B…

图神经网络:(大型图的有关处理)在Pumbed数据集上动手实现图神经网络

文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 Pumed数据集文献阅读继续实验 Pumed数据集 导库 from torch_…

不会Elasticsearch标准查询语句,如何分析数仓数据?

1 Elasticsearch的查询语句 ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 1.1 查询预发 # GET /…

案例分享|地弹现象导致DCDC电源芯片工作不正常

很多读者都应该听过地弹,但是实际遇到的地弹的问题应该很少。本案例就是一个DCDC电源芯片的案例。 1. 问题描述 如下图1 ,产品其中一个供电是12V转3.3V的电路,产品发货50K左右以后,大约有1%的产品无法启动,经过解耦定…

【C++】深入剖析C++11新特性

目录 一、C11简介 二、统一的列表初始化 1.{}初始化 2.std::initializer_list 三、声明 1.auto 2.decltype 3.nullptr 四、范围for 五、final和oberride 六、STL中一些变化 1.array 2.forward_list 3.unordered_map和unordered_set 七、右…

Python入门(十一)while循环(一)

while循环(一) 1.简介2.使用while循环3.让用户选择何时退出4.使用标志5.使用break退出循环6.在循环中使用continue7.避免无限循环 作者:xiou 1.简介 for循环用于针对集合中的每个元素都执行一个代码块,而while循环则不断运行&am…

虚幻引擎4利用粒子系统实现物体轨迹描绘

虚幻引擎4利用粒子系统实现物体轨迹描绘 目录 虚幻引擎4利用粒子系统实现物体轨迹描绘前言粒子系统利用粒子系统实现物体轨迹描绘创建粒子系统将粒子系统的产生位置绑定到运动物体上 小结 前言 由于在物体运动时,想要观察其总的运动轨迹,以便对其控制做…

CANoe-如何在Trace窗口显示SYN和FIN报文、同一条以太网报文在Trace窗口中的多条显示

1、如何在Trace窗口显示SYN和FIN报文 当我们使用CANoe实现TCP通信时,希望在Trace窗口直观显示报文的类型:SYN、ACK、FIN。显然Trace窗口也是支持这样的功能的。但很多时候由于一些人为的不正确的设置和配置,造成无法显示。 如果想解析出SYN报文,首先在Trace窗口选择正确的…

java注解

Target({ElementType.METHOD, ElementType.TYPE}) 注解的适用范围,可以用在什么地方,超过这个作用范围,编译的时候就会报错 值说明ElementType.METHOD用于描述方法ElementType.TYPE用于描述类、接口(包括注解类型) 或enum声明ElementType.LOCAL_VARIAB…

编程语言中,循环变量通常都用 i?你知道为什么吗?

01 前天,我在朋友圈发了一个问题: 为什么编程中,循环变量通常都是用 i ? 没想到,回复的人这么多!要连翻好几页。 这个问题,有 2/3 的人回答正确,有少部分人知道,但是不太确定。 习惯…

camunda如何发布和调用rest服务接口

一、camunda如何发布rest服务接口 Camunda BPM 平台本身提供了 REST API 接口,可以用于管理和操作 Camunda 平台中的各种资源和数据,如流程定义、流程实例、任务等。因此,我们可以通过编写 Camunda 应用程序的方式,将 Camunda RE…

最流行的开源 LLM (大语言模型)整理

本文对国内外公司、科研机构等组织开源的 LLM 进行了全面的整理。 Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 所谓"语言模…

基于DBSCAN密度聚类的风电-负荷场景削减方法

​目录 ​ 1 主要内容 基于密度聚类的数据预处理: 场景提取: 算法流程: 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《氢能支撑的风-燃气耦合低碳微网容量优化配置研究》第三章内容,实现的是基于DBSCAN…

八股文大全

八股文大全 1. 基础篇1.1 网络基础1.1.1 TCP 三次握手1.1.2 TCP四次挥手![在这里插入图片描述](https://img-blog.csdnimg.cn/90a6997e8d414c84b499167c99da0397.png)1.1.3 TCP常见面试题 1. 基础篇 1.1 网络基础 1.1.1 TCP 三次握手 三次握手过程: 客户端——发…

开心档之MySQL 数据类型

目录 MySQL 数据类型 数值类型 日期和时间类型 字符串类型 MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 数值类型 MySQL 支持所有标准 SQL 数值数据类型…

【信息安全案例】——信息内容安全(学习笔记)

📖 前言:在数字化时代,信息内容安全问题越来越引起人们的关注。信息内容安全主要包括对数据的机密性、完整性和可用性的保护,以及对用户隐私的保护等方面。针对信息内容安全的威胁,采取科学有效的安全措施和技术手段至…

面试京东失败,再看看2年前的面试题,根本不是一个难度···

刚从京东走出来,被二面难到了,我记得学长两年前去面试的时候,问的问题都特别简单,咋现在难度高了这么多。面试前我也刷过很多的题和看过很多资料,后来想想,这年头网上资料泛滥,测试面试文档更是…

从零玩转设计模式之外观模式-waiguanmos

title: 从零玩转设计模式之外观模式 date: 2022-12-12 15:49:05.322 updated: 2022-12-23 15:34:40.394 url: https://www.yby6.com/archives/waiguanmos categories: - 设计模式 tags: - 设计模式 什么是外观模式 外观模式是一种软件设计模式,它提供了一种将多个…