数据库的事务四大特性(ACID)、详解隔离性以及隔离级别、锁

文章目录

  • 🎉数据库的事务四大特性(ACID)以及隔离性
    • 一、事务的四大特性✨
      • 1、原子性(Atomicity)🎊
      • 2、一致性(Consistency)🎊
      • 3、隔离性(Isolation)🎊
      • 4、持久性(Durability)🎊
    • 二、详解事务的隔离性✨
      • 1、脏读🔮
      • 2、不可重复读🔮
      • 3、虚读(幻读)🔮
      • 4、隔离级别🔮
        • 1️⃣ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
        • 2️⃣ Read committed (读已提交):可避免脏读的发生。
        • 3️⃣ Repeatable read (可重复读):可避免脏读、不可重复读的发生。*MySQL默认隔离级别
        • 4️⃣ Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
    • 三、怎样算是一个事务🪄
      • 1、从第一次执行SQL语句开始到执行commit或者rollback结束。中间不管执行多少SQL语句都是同一个事务内。
      • 2、事务的开始与结束
      • 3、数据库如何实现事务的
    • 四、常用操作🌈-----记住:设置数据库的隔离级别一定要是在开启事务之前!
      • 1、查看提交状态命令
      • 2、关闭自动提交
      • 3、查看隔离级别
      • 4、修改隔离级别
      • 5、开启事务-----只要执行一条SQL语句就是开启事务,不一定非要使用start transaction;
      • 6、结束事务
    • 五、数据库事务怎么做✨
      • 1、如何进行事务🏆
        • 1️⃣ 建立引擎支持InnoDB,InnoDB支持数据库事务操作
        • 2️⃣ 设置autocommit为false
        • 3️⃣ 修改隔离级别
        • 4️⃣ 开启事务
        • 5️⃣ 执行SQL语句
        • 6️⃣ commit或者rollback(回滚)
      • 2、对Read Uncommitted级别进行操作
        • 1️⃣ 脏读:两次数据
      • 3、对Read Committed级别进行操作
        • 2️⃣ 不可重复读-----此时避免了脏读,但是还存在不可重复读的问题,看此标题下第二张图
      • 4、repeatable read隔离级别
        • 3️⃣ 解决了脏读、不可重复读
    • 六、锁🔒
      • 1、代码层次的乐观锁、删除锁
      • 2、数据库层次的悲观锁:

🎉数据库的事务四大特性(ACID)以及隔离性

一、事务的四大特性✨

1、原子性(Atomicity)🎊

  原子性是指事务包含的所有操作要么全部成功,要么全部回滚失败。因此事务的的操作如果成功就必须完全应用到数据库,如果操作失败不能对数据库有任何影响。

2、一致性(Consistency)🎊

  一致性是指事务必须是数据库从一个一致状态变换到另一个一致状态,也就是说一个事务执行之前和执行之后必须处于一致状态。

  🪄例如:那转账来说,假设用户A和用户B两者的钱加起来是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱加起来应该还得是5000,这就是事务的一致性。

3、隔离性(Isolation)🎊

  隔离性是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每个用户开启的事务,不能被其他事务的操作干扰,多个并发事务要互相隔离。

  即要达到一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后开始,这样每个事务都感觉不到有其他的事务在并发执行。

  关于事务的隔离性又提供了多种隔离级别,如读已提交、读未提交、可重复读、串行化,稍后会讲到。

4、持久性(Durability)🎊

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变是永久的,即便是在数据库系统中遇到 故障的情况下也不会丢失提交事务的操作。

  例如我们在使用JSDC操作数据库时,在提交事务后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使数据库出现了问题,也必须要将我们的事务完全执行完成,否则会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

二、详解事务的隔离性✨

  以上介绍完事务的四大特性(简称ACID),现在重点来说明一下事务的隔离性,当多个线程都开启事务的操作数据库中的数据,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生哪些问题:

1、脏读🔮

  脏读是指在一个事务处理过程里读取了另一个未提交事务中的数据。

  当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下

update account set money=money+100 where name=’B’;  (此时A通知B)update account set money=money - 100 where name=’A’;

  当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

2、不可重复读🔮

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

3、虚读(幻读)🔮

幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

4、隔离级别🔮

现在来看看MySQL数据库为我们提供的四种隔离级别(从低到高排序):

1️⃣ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

  第一隔离级别怕回滚,因为它能读取到别的事务未提交的数据。如果当前事务将这个数据当成真正的数据,那么如果别的事务回滚,那么就会数据错误,导致脏读。

2️⃣ Read committed (读已提交):可避免脏读的发生。

第二个隔离级别怕提交,因为提交会导致不可重复读。

3️⃣ Repeatable read (可重复读):可避免脏读、不可重复读的发生。*MySQL默认隔离级别
4️⃣ Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

三、怎样算是一个事务🪄

1、从第一次执行SQL语句开始到执行commit或者rollback结束。中间不管执行多少SQL语句都是同一个事务内。

2、事务的开始与结束

start transaction; # 开启事务
commit;或者rollback; # 事务结束

3、数据库如何实现事务的

  服务端有日志记录功能,新操作是记录到日志中的,commit会将日志中的记录刷到硬盘中,rollback就是将日志中的记录删除掉了

四、常用操作🌈-----记住:设置数据库的隔离级别一定要是在开启事务之前!

1、查看提交状态命令

show variables like '%auto%';

2、关闭自动提交

set autocommit = 0;

3、查看隔离级别

select @@transaction_isolation; # 8.x版本数据库系统
show variables like 'transaction_isolation'; # 8.x版本数据库系统
SELECT @@tx_isolatione 5.x

4、修改隔离级别

set session transaction isolation level ; # 8.x
set session transaction isolation ; # 5.x

5、开启事务-----只要执行一条SQL语句就是开启事务,不一定非要使用start transaction;

start transaction;

6、结束事务

commit;或者
rollback;

五、数据库事务怎么做✨

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

1、如何进行事务🏆

1️⃣ 建立引擎支持InnoDB,InnoDB支持数据库事务操作
2️⃣ 设置autocommit为false
show variables like '%auto%'; # 展示事务提交信息
set autocommit=0; # 设置autocommit为false
set autocommit=1; # 设置autocommit为true
3️⃣ 修改隔离级别
select @@transaction_isolation; # 查看隔离级别
set session transaction isolation level read uncommitted; # 设置隔离级别,此时设置为读未提交
4️⃣ 开启事务
5️⃣ 执行SQL语句
select * from employee;
update employee set sal=100 where empno=1022;
6️⃣ commit或者rollback(回滚)
commit;
rollback;

2、对Read Uncommitted级别进行操作

1️⃣ 脏读:两次数据

在这里插入图片描述

3、对Read Committed级别进行操作

2️⃣ 不可重复读-----此时避免了脏读,但是还存在不可重复读的问题,看此标题下第二张图

在这里插入图片描述

在这里插入图片描述

因为两个事务对同一个数据进行操作违反了隔离性,死锁。

在这里插入图片描述

对不同数据操作不报错

在这里插入图片描述

4、repeatable read隔离级别

3️⃣ 解决了脏读、不可重复读

在这里插入图片描述

记住:设置数据库的隔离级别一定要是在开启事务之前!

如果是使用JDBC对数据库的事务设置隔离级别的话,也应该是在调用Connection对象的setAutoCommit(false)方法之前。调用Connection对象的setTransactionIsolation(level)即可设置当前链接的隔离级别,至于参数level,可以使用Connection对象的字段:

在这里插入图片描述

在JDBC中设置隔离级别的部分代码:

在这里插入图片描述

后记:隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

六、锁🔒

1、代码层次的乐观锁、删除锁

在代码层次,乐观锁是一种在数据读取时不加锁的并发控制机制。它假设多个事务在同一时间对同一数据进行操作的可能性较小,因此只在更新数据时进行版本检查,以防止数据被其他事务同时修改。在MySQL中,可以使用版本号或时间戳等机制来实现乐观锁。例如,在更新数据时,可以检查该数据的版本号是否与最初读取时一致,如果不一致,则表示有其他事务修改了该数据,此时可以选择回滚或重试等操作。

2、数据库层次的悲观锁:

在数据库层次,悲观锁是一种在数据读取时加锁的并发控制机制。它假设多个事务在同一时间对同一数据进行操作的可能性较大,因此每次读取数据时都会对相应的数据进行加锁,以防止其他事务同时修改该数据。
在MySQL中,可以使用SELECT … FOR UPDATESELECT … LOCK IN SHARE MODE等语句来实现悲观锁。
例如,使用SELECT … FOR UPDATE语句时,会对选定的行进行加锁,直到事务结束时才释放锁。在此期间,其他事务无法对该行进行修改。

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

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

相关文章

双十一首日捷报 | 德施曼率先破亿,再度蝉联智能锁品类第一

10月31日晚8:00,各大平台迎来了双十一第一波现货开售。其中,在智能锁类目中德施曼势头最为迅猛,此前,德施曼凭借“全民换锁季”主题活动,在预售期间就已经全面引爆消费者换锁热潮,随着此次现货开售&#xf…

Linux内存管理的分页机制

分段机制的原理如下: 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移量。段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。虚拟地址中的段内偏移量…

bitlocker恢复保护时出现 驱动器加密错误 向导初始化失败 系统找不到指定文件

环境: Win 10专业版 联想E14 Gen2 问题描述: bitlocker恢复保护时出现 驱动器加密错误 向导初始化失败 系统找不到指定文件 电脑更换主板后,重新恢复保护出现 驱动器加密错误 解决方案: 1.尝试重启电脑(未解决&a…

Java进阶(List)——面试时List常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中List集合的面试问题,结合源码分析题目背后的知识点。 关于的Set的博客文章如下: Java进阶(Set)——面试时…

PowerToys使用:Windows自定义键盘(非编程)

使用紧凑型键盘或者苹果键盘有时候觉得挺麻烦,常用的键偏偏没有,特别是苹果键盘,没有【del】键,非常非常不爽。 笔记本电脑用久了,难免弄坏一两个键,比如【s】键,维修挺麻烦的,换新太…

爬虫 | 【实践】百度搜索链接爬取,生成标题词云 | 以“AI换脸”为例

目录 📚链接爬取 🐇流程梳理 🐇代码实现 🐇结果 📚词云生成 🐇代码实现 🐇结果 📚链接爬取 🐇流程梳理 总体流程是:构建搜索链接 -> 发送HTTP请求…

脉冲输出的三种模式

1.脉冲 方向 2.CW/CCW 3.A/B相(AB正交脉冲) 脉冲输出模式: 是指控制信号是单脉冲方式还是双脉冲方式,主要由控制器决定; 如果控制器发送的控制脉冲是单脉冲控制方式,驱动器需要采用单脉冲&#xff1b…

为什么要安装防静电门禁闸机

安装防静电门禁闸机可以带来以下几个方面的好处: 防止静电干扰:静电是一种非常危险的物理现象,它可以对电子元器件、电路板和其他敏感设备造成损害,甚至导致设备故障和生产中断。防静电门禁闸机可以有效地防止静电的产生和传导&am…

Spring Security 中自定义权限表达式

Spring Security 中自定义权限表达式 一. SpEL中使用自定义Bean二. 通过类继承自定义权限表达式2.1 自定义 ExpressionRoot 三. 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在…

Linux学习第27天:Platform设备驱动开发(一): 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 专注与分散是我在题目中着重说明的一个内容。这是今天我们要学习分离与分层概念的延伸。专注是说我们要专注某层驱动的开发,而对于其他层则是芯片厂商…

robot framework导入库和资源

robot framework导入库和资源 一 导入系统库和第三方库(Library)二 导入自己写的py文件三 建立资源作为关键字3.1 创建资源3.2 在资源里创建用户关键字3.3 使用用户关键字 四 将自己写的py文件中类的函数作为关键字4. 1编写py文件,文件名和里…

搭建VM虚拟机+Centos7 Oracle版 + 配置ssh + Xftp + secureCRT

文章目录 1 视频地址1.1 基本参数1.2 ISO下载地址:1.3 开启ssh1.3.1 使用root用户进行1.3.2 修改ssh配置1.3.3 关闭 SELINUX 2 查询虚拟机的ip2.1 联网2.2 桌面打开终端查询虚拟机ip 3 连接Xftp4 连接SecureRT 1 视频地址 01-搭建VM虚拟机Centos7 Oracle版 配置ss…

计算机网络-IP地址

文章目录 子网划分定长子网划分子网划分的方法子网掩码 可变长子网划分 无类别编址网络前缀路由聚合 特殊用途的IP地址专用网络地址链路本地地址运营商级NAT共享地址用于文档的测试网络地址 IP地址的规划和分配IP地址的规划和分配方法IP地址的规划和分配实例 子网划分 定长子网…

基于未来搜索算法的无人机航迹规划-附代码

基于未来搜索算法的无人机航迹规划 文章目录 基于未来搜索算法的无人机航迹规划1.未来搜索搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用未来搜索算法来优化无人机航迹规划。 …

装备制造行业云MES解决方案

一、装备制造行业发展现状: 机械制造业主要是通过对金属原材料物理形状的改变、加工组装进而成为产品。机械制造业生产的主要特点是:离散为主、流程为辅、装配为重点。 工业生产基本上分为两大方式: 1.离散型:离散型是指以一个…

《数据安全与流通:技术、架构与实践》新书发布

随着数据成为关键生产资料和要素,国内外数据安全相关的法律法规在快速完善,数据安全技术也在快速发展。5月25-26日,由星环科技、上海数据交易所、上海大数据联盟、财联社联合主办的向星力未来数据技术峰会 (FDTC)上&am…

C#__委托delegate

委托存储的是函数的引用(把某个函数赋值给一个委托类型的变量,这样的话这个变量就可以当成这个函数来进行使用了) 委托类型跟整型类型、浮点型类型一样,也是一种类型,是一种存储函数引用的类型 using System.Reflec…

目标检测理论知识

目标检测 1.基本概念 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,…

安装最新版vue-cli,并搭建一个vue2项目

安装最新版vue-cli,并搭建一个vue2项目 卸载旧版本环境 卸载node.js 可以使用qq电脑管家,找到nodejs卸载即可 cmd查看vue cli版本(可以看到我们是vue cli 2.x) C:\Users\youzhengjie666> vue -V 2.9.6卸载vue cli 2.x np…

CMake:构建时为特定目标运行自定义命令

CMake:构建时为特定目标运行自定义命令 导言项目结构相关源码结果 导言 add_custom_command 是 CMake 中用于添加自定义构建规则的命令,通常用于在编译项目时执行一些自定义操作,例如生成文件、运行脚本等。 项目结构 . ├── CMakeLists…