Mysql事务机制

news2024/11/24 9:00:21

目录

一:定义

二:事务的特质

三:检测ACID特性

1. 准备工作.

2. 测试原子性和持久性

case1: 模拟原子性的全部失败

case2:模拟原子性的全部成功

 case3:检查 持久性。

3. 测试一致性

case1: 用户1 向用户2 ,转账 1块。

 case 2:  开启两个事务

四、事务隔离性的等级

a.Read Uncommitted(读取未提交内容)

​编辑b.Read Committed(读取提交内容)

​编辑c.Repeatable Read(可重读)

d.Serializable(可串行化)


 

一:定义

并未有官方的统一定义

百度百科定义为:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

我自己的理解:事务是一个抽象的,虚拟的概念,它是一系列的数据操作动作(SQL)集合(多条)。者一系列的操作,要么全部执行成功,要么全部失败。

他的开启方式:

-- 1. begin
begin ;
XXXXX1 ;
XXXXX2 ;
XXXXX3 ;
commit ;

-- 2. start transaction
start transaction ;
XXXXX1 ;
XXXXX2 ;
XXXXX3 ;
commit ;

二:事务的特质

关系型数据的事务是为了保证数据的一致性和安全性

一致性和安全性表现在他的四个特质ACID。

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 永久性(Durability)
  1. 原子性(Atomicity)
    事务操作是最小的单元,不可再分,要么全部执行,要么全部不执行。如果有个操作出错,则回滚事务
     
  2. 一致性(Consistency)
    事务不能破坏数据的完整性和一致性,一个事务在执行之前和之后,数据库必须处于一致性状态。
    例如: 转账, A转账100 给B, 那么一致性要求 A 减去100, B增加100。两个步骤缺少一个就会导致数据库的数据不是一致的。
     
  3. 隔离性(Isolation)
    指的是并发的事务(多个事务同时执行),相互是隔离的,有各自完整的数据空间,事务执行的执行不会相互干扰。

    a.Read Uncommitted(读取未提交内容)
    所有事务都可以看到其他未提交事务的执行结果。


    b.Read Committed(读取提交内容)
    一个事务只能看见已经提交事务所做的改变。oracle和sql server的默认级别。

    c.Repeatable Read(可重读)
    mysql的默认级别。它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行

    d.Serializable(可串行化)
    最高的隔离级别,它会将事务排序
     
  4. 永久性(Durability)
    一旦事务被提交(commit),数据库的数据就将被永久的保留下来,不管后续服务器宕机还是数据库重启都能恢复到 事务成功后的状态。

四个特质是相辅相成的,不是相互独立的。


三:检测ACID特性

1. 准备工作.

-- 1. 创建测试表
CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

-- 2. 插入测试数据

insert into employee values (1,'111',1),(2,'222',2),(3,'333',3),(4,'444',4);

2. 测试原子性和持久性

     测试思路: 原子性要么全部成功,要么全部失败。则用多条更改sql组成的事务测试

case1: 模拟原子性的全部失败

begin;
--1. 更改 id=1 的名字为1 , 并查看更改结果
update employee set name='1' where id=1;
select * from employee ;

--2. 更改 id=2 的名字为2 , 并查看更改结果
update employee set name='2' where id=2;
select * from employee ;

--3. 测试全部失败,这里直接使用rollback模拟。 结果是和事务执行前一直。 即事务的所有操作失败
-- 正式开发可能是用 try catch逻辑来实现 有异常则回滚, 无异常则提交
rollback;
select * from employee ;

case2:模拟原子性的全部成功

begin;
--1. 更改 id=1 的名字为1 , 并查看更改结果
update employee set name='1' where id=1;
select * from employee ;

--2. 更改 id=2 的名字为2 , 并查看更改结果
update employee set name='2' where id=2;
select * from employee ;

--3. 测试全部成功,commit。 
-- 正式开发可能是用 try catch逻辑来实现 有异常则回滚, 无异常则提交
commit;
select * from employee ;

 

 case3:检查 持久性。

重启mysql  和 服务器(虚拟机)后,数据是否恢复到 id=1 name=‘1’,id=2 name=’2‘

3. 测试一致性

case1: 用户1 向用户2 ,转账 1块。

预期结果是:  用户1 的salary 为0, 用户2 的salary为3。 (忽视字段名的含义,哈哈哈)

-- 1- 开启事务
begin ;

-- 2- 用户1 转账1 快给 用户2 
-- 用户1 先扣去1块
update employee set salary=salary-1 where name='1' ;

-- 用户2 增加1块
update employee set salary=salary+1 where name='2' ;

-- 成功后提交
commit ;

-- 检查事务前后, 用户1和用户2 的总金额是 没变的。

 case 2:  开启两个事务

事务1 将 id=3 的salary 增加1, 并查看执行结果, 结果应该是4

事务2 查看id=3 的salary, 结果是3 。  体现了隔离性(两个事务有各自的数据空间)

事务1 将增加后的结果提交。

事务2 查看id=3 的salary, 结果还是3。 隔离性

事务2 将 id=3 的salary 增加1,  结果是 5 。 一致性,事务开始前后的数据一致。事务2更新前会再查询一次,保证数据一致。


四、事务隔离性的等级

它有四个隔离等级:


a.Read Uncommitted(读取未提交内容)


所有事务都可以看到其他未提交事务的执行结果。
这个会导致脏读
事务1读取一份数据
事务2改写这个数据
事务1再读取时是事务2更改后的
最后事务2在回滚。那么事务1读取的是事务修改未成功的数据。就是脏读

-- 将隔离等级改为 读取未提交
set session transaction isolation level READ UNCOMMITTED ;

-- 1. 事务1 修改  id=3 的salay + 1 , 并查看结果
-- 结果是 4

update employee set salary=salary+1 where id = 3;
select * from employee where id=3 ;

-- 2. 在事务2中 查看 id=3 的值
-- 结果是 4.  说明 1个事务没有提交的数据, 其他事务也能查看到

select * from employee where id=3 ;



b.Read Committed(读取提交内容)


一个事务只能看见已经提交事务所做的改变。oracle和sql server的默认级别。
事务1读取一份数据
事务2更改这份数据,并提交
事务1再次读取这份数据
这时事务1 第二次读取的数据 和 第1次读取的数据不一致,这现象好像是 不可以重复读取同一份数据一样(一个人不可能两次踏入同一条河)。 就是 不可重复读

-- 1. 事务1 修改  id=3 的salay + 1 , 并查看结果
-- 结果是 4
begin ;
update employee set salary=salary+1 where id = 3;
select * from employee where id=3 ;

-- 2. 将事务2 隔离等级改为 读取未提交
set session transaction isolation level READ COMMITTED;

-- 3. 在事务2中 查看 id=3 的值
-- 结果是 3

select * from employee where id=3 ;

-- 4. 事务1 提交操作
commit;

-- 5. 事务2 查看 id=3 的值, 结果是 4
-- 说明读取提交的隔离级别, 一个事务的操作数据,要提交后,其他事务才能查看

select * from employee where id=3 ;


c.Repeatable Read(可重读)


mysql的默认级别。它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行

 


d.Serializable(可串行化)


最高的隔离级别,它会将事务排序, 串行执行事务

-- 1. 更改隔离等级为 串行化
-- 事务1 修改  id=3 的salay + 1 , 并查看结果
-- 结果是 3
set session transaction isolation level SERIALIZABLE;
begin ;
update employee set salary=salary+1 where id = 3;
select * from employee where id=3 ;

-- 2. 将事务2 隔离等级改为 串行化
set session transaction isolation level SERIALIZABLE;

-- 3. 在事务2中 查看 id=3 的值
-- 会发现 事务2 卡主 (即等待 事务1 执行完毕)
select * from employee where id=3 ;

-- 4. 事务1 提交操作
commit;

-- 5. 查看事务2的 窗口, 更新操作执行完毕

select * from employee where id=3 ;

 事务2 在等待 事务1 借宿

 事务2 等待超时

 事务2 在事务1 提交后执行

 

 

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

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

相关文章

[附源码]计算机毕业设计springboot餐馆点餐管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

马尔可夫链

目录 1.相关概念 2.马尔可夫链的状态概率分布推演及稳态分布 3.马尔可夫链的应用 4.稳态分布性质 1.相关概念 小明同学每日选择早餐的概率转化如下图所示: 并且当日的选择只受前一日的结果以及对应的转移概率影响,与之前的选择无关。———> …

Spring Cloud Alibaba 容器化部署最佳实践 | 本地部署版本 | Seata服务端组件安装

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 下载地址 https://github.com/seata/seata/releases Seata安装-修改配…

PyQt5 信号(Signal)与槽(Slot)

PyQt5 信号与槽信号与槽介绍内置信号与槽的使用自定义信号与槽的使用自定义信号和内置槽函数自定义信号和自定义槽函数自定义有参信号使用自定义信号参数装饰器信号与槽信号与槽的断开和连接多线程中信号与槽的使用信号与槽介绍 信号(Signal)与槽(Slot)是Qt中的核心机制&#…

基于Spring Boot的个人博客系统(源码+数据库)

目录 一、系统功能框架图 二、开发技术 三、开发环境 四、页面展示 1.登录页面 2.首页 3.文章详情页面 4.文章评论页面 ​5.后台页面 6.后台文件编辑页面 ​7.后台文章管理列表页面 五、文件组织结构 六、数据库设计 1. 文章详情表t_article 2.文章评论表t_comm…

Elasticsearch:构建地图以按国家或地区比较指标

标如果你不熟悉 Elastic 地图,本教程是一个不错的起点。 它会指导你完成处理位置数据的常见步骤。在完成本教程后,你将学会: 创建具有多个图层和数据源的地图使用符号、颜色和标签来设置数据值的样式在仪表板中嵌入地图在仪表板中跨仪表盘搜索 完成本教…

【Scala专栏】数据类型、变量常量、类和对象

本文内容主要分为3节,依次讲解:Scala的数据类型有哪些? 变量常量如何使用? 类和对象如何理解? 受限于博主的大脑容量,大概是无法做到事无巨细的,不过其实也没必要那么"细"&#xff0c…

Java核心技术卷Ⅰ-第三章Java的基本程序设计结构

重点 1.数据类型 2.运算符 3.字符串 4.控制流程 5.数组 1.数据类型 整型:Java程序必须保证在所有机器上都能得到相同的运行结果,所以各种数据类型的取值范围是固定的;在C/C中,int和long类型的大小与目标平台相关 类型存储需求取值…

基于粒子群算法的线性规划问题求解matlab程序

基于粒子群算法的线性规划问题求解matlab程序 1 基本粒子群算法流程 粒子群算法基于“种群”和“进化”的概念,通过个体间的协作与竞争,实现复杂空间最优解的搜索,其流程如下: (1)初始化粒子群&#xff…

Apache Maven

Apache Maven简介安装Eclipse中安装内置的Maven插件Maven官网下载,直接安装在电脑上Maven安装目录结构bin目录boot目录conf目录lib目录Maven生命周期与命令Maven生命周期clean:清理cleanup:清理所有default:默认site:站…

做数据集增强时,训练一半出现IndexError: tuple index out of range这种错误,不知道怎么改,有神仙赐教一下嘛?

在用YOLOv5做图像训练时,首先做了数据集的增强,但是增强中出现了如下的错误 首先出现这样的警告 (A:/stdy py37-g/agu_img.py:153: DeprecationWarning: An exception was ignored while fetching the attribute __array_interface__ from an object of …

maven部署方案之分离业务包

一、思想: 通过将业务包和公共包分离,集中管理所有包,打包时只构建业务包减少项目包的大小和传输时间。 为了观测稳定性,暂通过环境区分,较为频繁的联调环境采用该方式,测试、预发、正式暂保持一体化打包…

golang实现andflow流程引擎

1、andflow引擎 andflow_js可以实现在Html端设计流程,并将设计结果保存为json模型,andflow可以用于设计业务流程、数据处理流程、工作流、控制流等一切可流程化的过程。 由于golang具备高效、跨平台、并且还能够直接编译成可执行文件,这些优…

selenium 找不到元素:Unable to find element on closed window

浏览器:IE 报错信息: Unable to find element on closed window Unable to get browser 过程:登录》跳转页面(同窗口)》点击备份按钮 已知代码没有改过,而且部署到多个机子上,很多机子没有问…

C++11(一)

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、列表初始化initializer_list二、声明1.auto2.decltype3.nullptr三、C11 STL中的变化1.array2.forward_list3.STL其他变化四、C关键字新功…

NOIP 装箱问题

题目:[NOIP2001]装箱问题 ,哈哈,我们今天来看一道很古老的题嘛,这是选自NOIP上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不是很方便阅读&#xff0…

常见的网络协议

目录 一、TCP/IP协议簇 二、网络设备与五层模型对应关系: 三、常用网络协议总结(TCP/IP协议簇) 四、应用层服务协议 五、传输层协议组 TCP_UDP 六、网络层协议 IP_ICMP_ARP 七、物理层协议 MAC子层协议 一、TCP/IP协议簇 OSI七层模型…

视频怎么转换为音频文件?快来掌握这几种方式

大家平时在下载网课资源进行学习的时候,看久了眼睛也会开始疲劳,而且有些视频的画面看起来很枯燥。其实我们可以使用一些软件把视频中的音频分离出来,直接收听音频也可以学到知识,而且我们还可以处理其他的事情,是不是…

《计算机体系结构量化研究方法第六版》1.5 集成电路中的功耗和能耗趋势

1.5.1 功耗和能耗:系统视角 Q1:处理器需要的最大功耗是多少? 如果处理器的预期功耗大于电源系统能够提供的功耗(试图汲取的电流大于电源系统可以提供的电流),通常会导致电压下降而让器件无法工作。在峰值…

食谱类小程序开发,升级美食服务质量

网络时代,人们可以在网上快速获取到各种资源信息,疫情的影响让人们被封控在家里出不了门,这也就给人们提供了一个回归厨房的契机,很多人在此期间开启了自己的美食制作之旅,朋友圈也变成了一个美食分享社区,…