MySQL事务相关笔记

杂项

InnoDB最大特点:支持事务行锁

MyISAM不支持事务

介绍

一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。事务有如下特性:

1.事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。

2.事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。

ACID特性

  • 事务的原子性(Atomic)
  • 事务的一致性(Consistency)
  • 事务的隔离性(Isolation)

当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响。

  • 事务的持久性(Durability)

事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为故障出错,也应该能够恢复数据!

ACD特性是由mysql的undo log和 redo log 保证;

I特性是由mysql事务 锁机制保证;

mysql中最重要的是日志而不是数据。

事务相关指令

BEGIN; 开启一个事务

COMMIT; 提交一个事务

ROLLBACK; 回滚一个事务到初始的位置

SAVEPOINT point1; 设置一个名字为point1的保存点

ROLLBACK TO point1; 事务回滚到保存点point1,而不是回滚到初始状态

SET TX_ISOLATION='REPEATABLE-READ'; 设置事务的隔离级别

SELECT @@ TX_ISOLATION; 查询事务的隔离级别

实践例子

查看是否设置了自动提交:

在这里插入图片描述

事务并发存在的问题

  • 脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据。(事务B读取了事务A尚未提交的数据)
  • 不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读取到不同的数据。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样。(事务B读取了事务A已提交的数据)
  • 虚读(Phantom Read)幻读:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)

事务的隔离级别

MySQL支持的四种隔离级别是:

1、READ-UNCOMMITTED未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的。

2、READ-COMMITTED已提交读。说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。

3、REPEATABLE-READ可重复读。说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。

4、SERIALIZABLE。串行化。是最高的事务级别,它防止读脏数据,不可重复读和虚读。(它相当于加了读写锁,某个会话读时,其他线程不能写)

在这里插入图片描述

注解

事务隔离级别越高,为避免冲突所花费的性能也就越多,降低并发度。

在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止 update 更新产生的虚读问题,要禁止幻读产生,还是需要设置串行化隔离级别。

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

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

相关文章

大数据面试题-场景题

1.手写Flink的UV 手写Flink的UV 2.Flink的分组TopN Flink的分组TopN 3.Spark的分组TopN 1)方法1: (1)按照key对数据进行聚合(groupByKey) (2)将value转换为数组,利…

银河麒麟服务器v10 sp1 安装mysql

可以先用 dpkg --list|grep mysql 查看自己的mysql有哪些依赖: 上图已经是安装后的截图,然后再卸载 sudo apt-get autoremove --purge mysql-common 本文在没有安装之前,只有mysql-common包,再用dpkg --list|grep mysql查看&…

联邦学习中的模型聚合

目录 联邦学习中的模型聚合 1.client-server 算法 2. fully decentralized(完全去中心化)算法 联邦学习中的模型聚合 在联邦学习的情景下引入了多任务学习,其采用的手段是使每个client/task节点的训练数据分布不同,从而使各任务节点学习到不同的模型…

ELK增量同步数据【MySql->ES】

一、前置条件 1. linux,已经搭建好的logstasheskibana【系列版本7.0X】,es 的plugs中安装ik分词器 ES版本: Logstash版本: (以上部署,都是运维同事搞的,我不会部署,同事给力&#…

Neighborhood Contrastive Learning for Novel Class Discovery (CVPR 2021)

Neighborhood Contrastive Learning for Novel Class Discovery (CVPR 2021) 摘要 在本文中,我们解决了新类发现(NCD)的问题,即给定一个具有已知类的有标签数据集,在一组未标记的样本中揭示新的类。我们利用ncd的特性构建了一个新的框架&am…

JMeter之事务控制器实践

目录 前言 事务控制器 JMeter控制器添加路径: Generate parent sample 1、不勾选任何选项: 2、勾选【Generate parent sample】 3、Include duration of timer and pre-post processors in generated sample 小结 前言 在JMeter中,事…

Linux下GO IDE安装和配置(附快捷键)

目前,GoLand、VSCode 这些 IDE 都很优秀,但它们都是 Windows 系统下的 IDE。在 Linux 系统下我们可以选择将 Vim 配置成 Go IDE。熟练 Vim IDE 操作之后,开发效率不输 GoLand 和 VSCode。有多种方法可以配置一个 Vim IDE,这里我选…

基于免疫优化算法的物流配送中心选址规划研究(Matlab实现)

目录 1 概述 2 物流配送中心选址规划研究 3 Matlab代码 4 结果 1 概述 影响物流配送中心选址的因素有很多,精确选址优化问题亟待解决。通过充分考虑货物的配送时间,将免疫算法加入其中,介绍了物流配送选址模型的构建以及免疫算法实现的相关步骤,最后利用matlab软件进行分析,提出…

UE5.2 LyraDemo源码阅读笔记(二)

UE5.2 LyraDemo源码阅读笔记(二) 创建了关卡中的体验玩家Actor和7个体验玩法入口之后。 接下来操作关卡中的玩家与玩法入口交互,进入玩法入口,选择进入B_LyraFrontEnd_Experience玩法入口,也就是第3个入口。触发以下请…

web学习1--maven--项目管理工具

写在前面: 这学期搞主攻算法去了,web的知识都快忘了。开始复习学习了。 文章目录 maven介绍功能介绍maven安装jar包搜索仓库 pom文件项目介绍父工程依赖管理属性控制可选依赖构建 依赖管理依赖的传递排除依赖可选依赖 maven生命周期分模块开发模块聚合…

算法的时间复杂度

算法的时间复杂度 什么是时间复杂度 时间复杂度是衡量算法执行时间随输入规模增长而增长的度量标准。它描述了算法运行时间与问题规模之间的关系,用于评估算法的效率和性能。 通常情况下,时间复杂度表示为大O符号(O)&#xff0…

限时等待的互斥量

本文结束一种新的锁&#xff0c;称为 timed_mutex 代码如下&#xff1a; #include<iostream> #include<mutex> #include<thread> #include<string> #include<chrono>using namespace std;timed_mutex tmx;void fun1(int id, const string&a…