mysql数据库事务(事务设置、隔离级别、实现原理)

目录

事务

数据库事务

事务特性

事务设置

事务隔离级别

1.读未提交

2.读已提交

3.可重复读

4.串行化

事务实现原理

原子性:undolog

持久性:redolog

隔离性:

如果隔离级别是读已提交:

如果隔离级别是可重复读:


事务

数据库事务

一次对数据库操作过程,有多条sql,视为一组,一次执行,一组sql要么都提交成功,要么都失败。保证数据的完整性,mysql中只有i使用nnodb引擎的数据库或表支持事务。

事务特性

原子性:一个事务中的多条sql要么都执行成功,要么都失败,回滚到执行前的状态。

隔离性:数据库中的事物可以多个同时执行,有读未提交、读已提交、可重复读和串行化四种。

持久性:事务提交后,保证数据永久保存,即使宕机。

一致性:保证数据是完整可靠的,原子性、隔离性、持久性都是为了保证数据的一致性。

事务设置

关闭自动事务提交:

set global autocommit = 0;

查看事务自动提交开启的情况:

show  global  varlables like 'autocommit';

-- 开启事务:

begin;

       (sql语句)

rollback;-- 事务回滚

commit; -- 事务提交

事务隔离级别

查看事务的隔离级别:

SELECT @@session.transaction_isolation,@@transaction_isolation;

1.读未提交

 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

 另一个事务正在更改数据,但还没有提交事务,该事物若读取数据,可能造成脏读,不可重复读,幻读。

2.读已提交

 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

一个事务只能读到另一个事务提交后的数据,解决了脏读问题,但还存在不可重复读,幻读。 

不可重复读:

         一个事务在执行事务时,先后读两次,两次结果不相同。

3.可重复读

 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

一个事务在执行时,多次读取数据是一致的。

解决了不可重复读问题,但是幻读问题没有完全解决。

例如下图,事务1不加for update 执行时,事务2添加一行记录后事务1不会幻读,当事务2提交后,事务1若有for update则会出现幻读。

幻读:

 一个事务读取到的数据量不同(insert delete)

4.串行化

 事务只能一个一个进行,即使一个事务写,另一个事务读不可以,但是读读可以,读写不可以。

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE 

事务实现原理

原子性:undolog

mysql使用undolog日志文件,用来记录增删改操作的反向作

insert delete

delete insert

update update

出现异常,事务回滚,执行对应操作的反向操作。

持久性:redolog

redolog

当数据库事务提交后,保证数据是不可撤销。

当sql发送到mysql后,事务还未提交之前,如果发生断电/宕机

会将sql保存到redolog日志文件中

在mysql重启时 执行redolog中的sql

隔离性:

MVCC:多版本并发控制,每次事务对某记录操作时,会生成一个操作的版本链

如果隔离级别是读已提交

在同一个事务中,每次读取时都会从版本链上生成一个快照(readView)

 每次读到得是查询时最新的数据。也称为当前读。

如果隔离级别是可重复读

在事务第一次读取数据时,会从版本链上生成一个快照(readView)

之后再次读取时,仍然会从上次的版本快照中读,

所以隔离级别是可重复读,也称为快照读。

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

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

相关文章

【Linux】 开始使用 gcc 吧!!!

Linux 1 认识gcc2 背景知识3 gcc 怎样完成 ?3.1 预处理预处理^条件编译 3.2 编译3.3 汇编3.4 链接 4 函数库5 gcc 基本选项Thanks♪(・ω・)ノ谢谢阅读下一篇文章见!!! 1 认识gcc 我们在windows环…

系统架构设计师教程(十六)嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 16.1 嵌入式系统概述16.1.1 嵌入式系统发展历程16.1.2 嵌人式系统硬件体系结构16.2 嵌入式系统软件架构原理与特征16.2.1 两种典型的嵌入式系统架构模式16.2.2 嵌入式操作系统16.2.3 嵌入式数据库16.2.4 嵌入式中间件16.2.5 嵌入式系统软件开发环…

智能风控体系之divergence评分卡简介

评分卡模型的出现据说最早是在20世纪40年代,Household Finance and Spiegel和芝加哥邮购公司第一次尝试在贷款决策过程中使用信用评分.但是这两家公司都终止了这项业务。后来,在20世纪50年代末,伊利诺伊州的美国投资公司(AIC&…

《WebKit 技术内幕》学习之十四(1):调式机制

第14章 调试机制 支持调试HTML、CSS和JavaScript代码是浏览器或者渲染引擎需要提供的一项非常重要的功能,这里包括两种调试类型:其一是功能,其二是性能。功能调试能够帮助HTML开发者使用单步调试等技术来查找代码中的问题,性能调…

Spring Boot 模块工程(通过 Maven Archetype)建立

前言 看到我身边的朋友反馈说,IDEA 新建项目时,如果通过 Spring Initializr 来创建 Spring Boot , 已经无法选择 Java 8 版本,通过上小节的教程,不知道该如何创建 Spring Boot 模块工程。如下图所示: 一.IDEA 搭建 …

Kafka(八)使用Kafka构建数据管道

目录 1 使用场景2 构建数据管道时需要考虑的问题2.1 及时性2.2 可靠性高可用可靠性数据传递 2.3 高吞吐量2.4 数据格式2.5 转换ETLELT 2.6 安全性2.7 故障处理2.8 耦合性和灵活性临时数据管道元数据丢失末端处理 3 使用Connect API3.1 Connect的数据处理流程sourcesinkconnecto…

IP组播地址

目录 1.硬件组播 2.因特网范围内的组播 IP组播地址让源设备能够将分组发送给一组设备。属于多播组的设备将被分配一个组播组IP地址 组播地址范围为224.0.0.0~239.255.255.255(D类地址),一个D类地址表示一个组播组。只能用作分组的目标地址。源地址总是为单播地址…

丝路昆仑文物展:启用网关,文物预防性保护设备数据无缝对接平台

一、多功能网关数据无缝流转 近日,“丝路昆仑——新疆文物精品展”在天津博物馆开展。展览分为三部分:“丝路前奏”、“丝路华响”和“丝路梵音”,前两部分是以张骞凿通西域前后的中原西域两地文化交流,第三部分则讲述了佛教沿西…

【并发】什么是 Future?

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 关键特性和操作包括: 提交任务: 查询完成状态: 等待结果: 取消任务&#xff1a…

golang整合rabbitmq,创建交换机并绑定队列

1,如果要开发消息队列,需要创建交换机和队列,通常有2中方式创建,1种是在面板直接创建 2,第二种就是在代码中创建,这里 展示的是go语言代码中创建rabbitmq package mainimport ("fmt""log""github.com/streadway/amqp" )func main() {// 连接R…

年销180万辆的特斯拉,护城河却在崩塌

文|刘俊宏 2023年率先开启汽车价格战的马斯克,伤敌一百自损八千? 在1月25日的特斯拉2023Q4财报电话会上,特斯拉CEO马斯克对中国公司的竞争力如此感叹道,“要是没有贸易壁垒,他们将摧毁(destroy…

SpringBlade微服务开发平台

采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:BladeToolBladeTool已推送至…

Git--创建仓库(1)

git init Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。 在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有…

通俗易懂理解SegNet语义分割模型

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。 一、参考资料 深度学习之图像分割—— SegNet基本思想和网络结构以及论文补充 一文带你读懂 SegNet(语义分割) 二、相关介绍 1. 上采样(…

vue3中使用markdown编辑器

首先安装 npm i md-editor-v3 Setup 模板 <template><MdEditor v-model"text" /> </template><script setup> import { ref } from vue; import { MdEditor } from md-editor-v3; import md-editor-v3/lib/style.css;const text ref(Hell…

R语言-检验正态性

1.为什么要检验正态性 首先需要明确正态性与正态分布是有区别的&#xff0c;正态分布&#xff08;标准分布&#xff09;是统计数据的分布方式&#xff0c;是个钟形曲线&#xff0c;已平均值为对称轴&#xff0c;数据在对称轴两侧对称分布。正态性是检验实际数据与标准正态分布…

消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

问题概览 目前主流的消息队列技术&#xff08;MQ技术&#xff09;分为RabbitMQ和Kafka&#xff0c;其中深蓝色为只要是MQ&#xff0c;一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ的应用场景 MQ主要提供的功能为&#xff1a;异…

Linux shell编程学习笔记42:hdparm命令

ChatGPT 和文心一言哪个更好用&#xff1f; 从智能回复、语言准确性、知识库丰富度等方面比较&#xff0c;两大AI助手哪个更胜一筹&#xff1f;快来和我们分享一下你的看法吧~ 0 前言 获取硬盘序列号是信息资产管理和信息安全检测中经常要收集的信息&#xff0c;对于Linux来说…

Unity - 将项目转为HDRP

Camera window -> Package Manager 之后会出现HDRP向导窗口&#xff0c;均点击修复。 在Edit中&#xff0c;更改项目中的材质