数据库中的事务

一、理解事务

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.mzph.cn/pingmian/48647.shtml

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

相关文章

国内访问Docker Hub慢问题解决方法

在国内访问Docker Hub时可能会遇到一些困难,但幸运的是,有多种解决方案可以帮助你顺利下载Docker镜像。以下是一些有效的解决方案: 配置Docker镜像源:你可以通过配置Docker的daemon.json文件来使用国内镜像源,比如DaoC…

SpringCloud极限速通版

1.SpringCloud概述 1.1 什么是微服务 1.1.1 单体架构 业务所有功能都打包在一个war包或jar包,这种方式就是单体架构,单体架构的应用就是单体应用。这种架构开发简单,部署简单,一个项目包含所有功能;省去了多个项目之…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(七)-广播远程识别码(Broadcast Remote ID)

目录 引言 5.5 广播远程识别码(Broadcast Remote ID) 5.5.1 使用PC5的广播远程识别码 5.5.2 使用MBS的广播远程识别码 引言 3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及…

Sui主网升级至V1.28.4版本

Sui主网现已升级至V1.28.4版本,同时Sui协议升级至51版本。其他升级要点如下所示: #18536 将所有可能的connect_lazy错误推迟到请求时间处理。 #18206 明确将每轮领导者人数设置为1,以支持Mysticeti提交。 #17868 引入新功能标志和协议配…

MyBatis:高级标签使用技巧的详细指南

请关注微信公众号:拾荒的小海螺 博客地址:http://lsk-ww.cn/ 1、简述 MyBatis 是一个优秀的持久层框架,提供了简单和灵活的 SQL 映射功能。除了基础的查询、插入、更新和删除操作外,MyBatis 还提供了一些高级标签,帮…

SQL 简单查询

目录 一、投影查询 1、指定特定列查询 2、修改返回列名查询 3、计算值查询 二、选择查询 1、使用关系表达式 2、使用逻辑表达式 3、使用 BETWEEN关键字 4、使用 IN关键字 5、使用 LIKE关键字 6、使用 IS NULL/ NOT NULL关键字 7、符合条件查询 三、聚合函数查询 一…

Docker_一刀流_好用、好玩还方便_(持续更新)

Docker 简介一、镜像和容器的概念镜像(Image)容器(Container)镜像和容器的关系 宿主机二、Dockerfile2.1 什么是Dockerfile2.2 Dockerfile中的常见指令2.3Dockerfile实例2.4 详细扩展 三、镜像3.1 镜像的创建3.2对于镜像的一些常用…

知识表示 | 利用 Protégé 软件构建小型本体

Hi,大家好,我是半亩花海。本项目旨在利用 Protg 软件构建小型本体,探索本体建模的实际应用,特别是应用本体与上层本体之间的关系继承与映射。我们将重点理解应用本体如何继承上层本体的关系,以及如何通过推理机制揭示实…

一起搭WPF界面之MVVM架构的简单搭建

一起搭WPF界面之MVVM架构的简单搭建 1 前言2 创建项目2.1新建项目2.2WPF2.3创建完成 3 MVVM划分3.1 划分逻辑3.2文件夹创建3.3文件创建3.3.1 Views——可在主界面的基础上,划分多个用户控件模块3.3.2 ViewModels——创建数据结构存放的cs文件3.3.3 Models——创建处…

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给…

用神经网络求解微分方程

微分方程是物理科学的主角之一,在工程、生物、经济甚至社会科学中都有广泛的应用。粗略地说,它们告诉我们一个量如何随时间变化(或其他参数,但通常我们对时间变化感兴趣)。我们可以了解人口、股票价格,甚至…

艺术成分很高的完全自定义的UITabBar(很简单)

引言 在iOS应用开发中,UITabBar是一个非常场景且重要的UI组件。系统为我们提供的UITabBar虽然功能强大,但是在某些情况下,它的标准样式并不能满足我们特定的设计需求,它的灵活性也有一些局限。为了打造更具个性化好的用户友好的交…

显卡驱动程序下载失败的原因及对策

在数字时代,显卡作为电脑的心脏部件之一,其驱动程序的正常运行是保证图形处理性能的关键。然而,不少用户在尝试下载显卡驱动程序时遭遇失败,这不仅影响了日常使用体验,还可能埋下系统不稳定的风险。本文将深入探讨显卡…

Mamba中的Mamba:在标记化Mamba模型中的集中式Mamba跨扫描高光谱图像分类

摘要 https://arxiv.org/pdf/2405.12003 高光谱图像(HSI)分类在遥感(RS)领域至关重要,尤其是随着深度学习技术的不断进步。顺序模型,如循环神经网络(RNNs)和Transformer&#xff0…

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …

随机变量的数学期望

目录 简介 基本概念 数学期望的定义 数学期望的性质 数学期望的应用 计算实例 数学期望在解决哪些具体问题时最为有效&#xff1f; 如何计算两个或多个随机变量的组合概率及其期望值&#xff1f; 1. 计算组合概率 2. 计算期望值 当涉及到两个或多个随机变量的组合时&…

git实操之线上分支合并

线上分支合并 【 1 】本地dev分支合并到本地master上 # 本地dev分支合并到本地master上# 远程(线上)分支合并# 本地dev分支合并到本地master上# 远程(线上)分支合并#####本地和线上分支同步################ #### 远程创建分支&#xff0c;拉取到本地####-远程创建分支&#…

自定义Bean转换工具类

BeanConvertor工具类&#xff1a;简化Java对象转换的利器 在Java开发中,我们经常需要在不同的对象之间转换数据。这可能是因为我们需要将数据从一个层(如数据访问层)转移到另一个层(如服务层或表示层),或者是因为我们需要将外部API的数据结构转换为我们的内部数据结构。这种转…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…