数据库中的事务

news2024/11/24 14:02:48

一、理解事务

1、本质

事务由一组DML语句组成,这一组语句要么全部成功,要么全部失败。在逻辑上,事务就是一组sql语句,但在实际中,公共的数据库一定会高并发地接受各种事务的请求,所以一个事务要有4个属性来保护数据库中的数据。

2、属性

原子性(Atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环 节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过 一样。

一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有 的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时 由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交( Read uncommitted )、读提交 ( read committed )、可重复读( repeatable read )和串行化( Serializable )

持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3、进一步理解事务

事务不是数据库天生就有的,而是我们在操作数据时,数据库自己来考虑潜在的问题并解决,本质就是为了服务于应用层,简化我们编程模型。

4、事务的提交方式

(1)显示提交方式

show variables like 'autocommit';

(2)修改提交方式

set autocommit=0;      OFF

set autocommit=1;       ON

二、事务的正常操作

1、启动事务

start transaction; / begin;

2、创建保存点

savepoint save_name;

3、定向回滚

rollback save_name;

4、结束事务(提交)

commit;

5、丢弃全部事务操作

rollback;

三、事务的非正常操作

1、commit 之前发生异常,自动回滚,保证原子性。

2、commit 之后,数据被插入,保证持久性。

3、若是手动 begin 开启事务,一定是手动 commit 提交事务,数据才会持久化,和 sutocommit 是否开启无关。

4、我们之前没有 begin 进入事务的 CURD 操作在数据库看来是一次次单sql语句事务,autocommit 影响的是未进入 begin 进行的单sql语句事务。即 autocommit打开遇到异常上一次操作自动提交,autocommit关闭就自动回滚。

四、事务的隔离级别

在用户层面看,事务就是原子的,只有执行前和执行后,但其实任何事物都会有执行中,多个事务也相互影响。所以为了在执行中不受干扰就会有隔离性。

1、隔离级别

(1)读未提交(Read Uncommitted): 在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。 (实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多并发问题,如脏读,幻 读,不可重复读等。

(2)读提交(Read Committed) :该隔离级别是大多数数据库的默认的隔离级别(不是 MySQL 默认的)。它满 足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读, 即一个事务执行时,如果多次 select, 可能得到不同的结果。

(3)可重复读(Repeatable Read): 这是 MySQL 默认的隔离级别,它确保同一个事务,在执行中,多次读取操 作数据时,会看到同样的数据行。但是会有幻读问题。

(4)串行化(Serializable): 这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了 幻读的问题。它在每个读的数据行上面加上共享锁。但是可能会导致超时和锁竞争(这种隔离级别太极端, 实际生产基本不使用)。增删改操作会放入等待队列中,只有查看的锁解开提交才会进行操作。

2、查看与设置隔离性

(1)查看

查看全局隔离级别:select @@global.tx_isolation    

查看当前会话隔离级别:select @@session.tx_isolation

同上简写:select @@tx_isolation

(2)设置

set [session, global] transaction isolation level [read uncommitted, read committed, repeatable read, serializable];

会话的隔离级别只会影响当前会话。全局隔离级别在设置后,新起一次会话就会影响之后会话的隔离级别。

3、隔离级别的问题

(1)脏读

在一个事务中读到另一个事务修改但是未提交的内容。

(2)不可重复读

一个事务读到另一个事务提交之后的数据,就会导致多次读到不同的数据。

(3)幻读

两个事务并发运行,是不可以读到对方的任何操作的,但是一般数据库在RR级别依然无法对 insert 进行隔离(隔离性的实现是对数据上锁,但是insert的数据是不存在的,所以一般无法屏蔽此问题)就会导致读到越来越多的数据。

五、一致性

1、事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的 结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务 对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原 子性来保证的。

2、其实一致性和用户的业务逻辑强相关,一般MySQL提供技术支持,但是一致性还是要用户业务逻辑做支撑,也 就是一致性是由用户决定的。

3、而技术上,通过AID保证C

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos7 xtrabackup mysql(8)增量备份(1)

centos7 xtrabackup mysql(8)增量备份(1) 参考 xtrabackup-8.0的安装、备份以及恢复(innoxtrabackup有待测试) https://blog.csdn.net/DWJRIVER/article/details/117792271 https://blog.csdn.net/qq_28…

力扣高频SQL 50 题(基础版)第四题

文章目录 力扣高频SQL 50 题(基础版)第四题584.寻找用户推荐人题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题(基础版)第四题 584.寻找用户推荐人 题目说明 表: Customer -------------------- | Colu…

Weakly Supervised Contrastive Learning 论文阅读

Abstract 无监督视觉表示学习因对比学习的最新成就而受到计算机视觉领域的广泛关注。现有的大多数对比学习框架采用实例区分作为预设任务,将每个实例视为一个不同的类。然而,这种方法不可避免地会导致类别冲突问题,从而损害所学习表示的质量…

智能算法驱动的爬虫平台:解锁网络数据的无限潜力

摘要 在信息爆炸的时代,网络数据如同深海宝藏,等待着有识之士发掘其无尽价值。本文将探索智能算法驱动的爬虫平台如何成为解锁这一宝库的关键,不仅剖析其技术优势,还通过实例展示它如何助力企业与开发者高效、稳定地采集数据&…

Codeforces Round 654 (Div. 2) C. A Cookie for You (模拟)

我认为这道题就是个脑筋急转弯。 首先我们知道当a b < n m的时候&#xff0c;饼干总数都不够人的总数&#xff0c;那肯定是NO。 并且注意题干&#xff0c;我们可以得知当a b的时候&#xff0c;第一类和第二类人可以任意选两种饼干中的一种。 之后我们可以分类讨论一下。 …

【SpringBoot】 4 Thymeleaf

官网 https://www.thymeleaf.org/ 介绍 Thymeleaf 是一个适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 模板引擎&#xff1a;为了使用户界面和业务数据分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;用于网站的模板引擎会生成一个标准的 html 文档…

【vue前端项目实战案例】Vue3仿今日头条App

本文将开发一款仿“今日头条”的新闻App。该案例是基于 Vue3.0 Vue Router webpack TypeScript 等技术栈实现的一款新闻资讯类App&#xff0c;适合有一定Vue框架使用经验的开发者进行学习。 项目源码在文章末尾 1 项目概述 该项目是一款“今日头条”的新闻资讯App&#xf…

防爆开关的类型及工作原理,你了解多少?

在工业生产中&#xff0c;安全始终是首要考量。特别是在易燃、易爆环境下的作业&#xff0c;如化工厂、油库、矿井等场所&#xff0c;任何微小的火花都可能引发灾难性的后果。防爆开关作为一种关键的安全设备&#xff0c;其重要性不言而喻。 【一、防爆开关的定义与重要性】 …

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(四)高斯牛顿法详解

一、高斯牛顿法详解 拓展阅读&#xff1a;高斯牛顿法详解_gauss-newton算法步骤-CSDN博客 1、梯度下降法 ​ ​ ​ 无论一阶泰勒展开&#xff0c;还是二阶泰勒展开都是关于增量​的方程。 2、牛顿法 ​ 这个自变量增量都是可求的。但是二阶求解复杂。因此为了简化有了下…

2023IMO预选题几何第6题

锐角 △ A B C \triangle ABC △ABC 的外接圆为 ω \omega ω, 圆 I I I 与 ω \omega ω 内切于 A A A, 且与 B C BC BC 切于点 D D D. 设直线 A B AB AB, A C AC AC 分别与 I I I 交于点 P P P, Q Q Q, 点 M M M, N N N 在直线 B C BC BC 上, 满足 B B B 是 …

【Golang 面试基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…

【HarmonyOS】应用推送使用个推SDK如何实现?

【HarmonyOS】应用推送使用个推SDK如何实现&#xff1f; 前言 个推和极光都是市面上很成熟的推送第三方SDK了。今天讲讲个推SDK在鸿蒙中如何集成使用。 存在即合理&#xff0c;三方SDK推送给我们带来了极大的好处&#xff0c;首先在服务器后台处理一套API就可搞定&#xff0…

lambda 28

package Api;public class local7 {public static void main(String[] args) {Swimmimg w()->{System.out.println("方式");};} } interface Swimmimg{void run(); }/* public static void main(String[] args) {Animal a new Animal(){Overridepublic void…

基于高光谱图像的压缩感知网络

压缩感知算法原理 压缩感知&#xff08;Compressed Sensing, CS&#xff09;是一种信号处理技术&#xff0c;它允许在远低于Nyquist采样率的情况下对信号进行有效采样和重建。压缩感知理论的核心思想是利用信号的稀疏性&#xff0c;通过少量的线性测量重建出原始信号。以下是压…

指令重排:

目录 指令重排&#xff1a; 代码&#xff1a; 执行结果&#xff1a; 分析原因&#xff1a; 解决办法&#xff1a; 加入语句&#xff1a; 完整代码&#xff1a; 补充&#xff1a; 1.printStackTrace(); 2.yield() 指令重排&#xff1a; 在class文件执行的时候&#…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的&#xff0c;因此你可以根据需要测量的距离&#xff0c;自定义深度相机安装基线&#xff0c;并根据你的项目要求&#xff08;分辨率、快门类型、FPS、光学元件&#xff…

【C++】选择结构-switch语句

switch 语句语法格式&#xff1a; switch (已定义整型或字符型变量名) { case 单个整型或字符型1&#xff1a; 满足这个 case 下整型或字符型执行的操作 break; case 单个整型或字符型2&#xff1a; 满足这个 case 下整型或字符型执行的操作 break; ...... default : 所有 ca…

SpringBoot3整合Druid报错Cannot load driver class: org.h2.Driver

报错显示springboot自带的H2数据库报错&#xff0c;其实是因为druid并未加载进去。如果你其它配置都没问题的话&#xff0c;请检查druid的依赖是什么版本的&#xff0c;因为springboot3刚开始是不支持druid的。 方案一&#xff1a; 即需要手动在resources目录下创建META-INF/s…