[MySQL]02关于事务的解析

目录

原子性

一致性

持久性

隔离性

事务隔离级别

并发执行可能存在问题

脏读问题

不可重复读

幻读

难点解析


原子性

事务最核心的就是原子性
以前人们认为原子不可再分,用原子性来表示一个事务不可分割

update account set balance=balance-500 where name ="张三"
如果在此过程中数据库崩溃,那么张三扣钱而李四不加钱
update account set balance=balance+500 where name ="李四"

要么全部都不执行,要么全部都执行

事务就能保证,当执行过程中出现问题的时候,自动把前面SQL执行的效果进行还原,恢复如初,回滚rollback

在事务执行过程中,mysql才会记录每一步执行了什么,一旦有问题就回滚

事务有空间代价和时间代价,事务只有在开启状态才会消耗这些代价

如果是ctrl+z的话意味着每一步回退和记录都得消耗这个空间和时间


实际上人对SQL操作在实际运用中并不是很多,大部分都是机械在对服务器进行操作,出错概率很小,撤回机制没有必要。

开启事务:start transaction;

执行多条SQL语句

回滚或提交:rollback/commit;

除了原子性外事务还有



一致性


事务执行前后,数据处在一致状态,数据CURD对的上



持久性


事务进行的改动,都是写到硬盘,不会随着程序重启/主机重启后丢失



隔离性


多个事务,并发执行的时候,事务之间能够保持隔离,互不干扰。
同一时刻,多个客户端都给服务器提交事务,执行事务


事务隔离级别

  • read uncommitted 允许读未提交的数据,并发程度相当高,隔离性最低,可能有脏读,不可重复读,幻读的问题
  • read commited 只能读提交后的数据,相当于对写进行加锁,并发性开始下降,隔离性开始提高,解决了脏读的问题
  • repeatable read 读和写操作都加了锁,并发程度再降低,隔离性再提高,解决了脏读,不可重复读,可能会有幻读的问题
  • serializable 严格执行串行化,并发程度最低,隔离性最高,解决了脏读,不可重复读,幻读的问题,但效率最低

MySQL默认为repeatable read
在MySQL配置文件中my.ini中进行设置,根据不同的需求场景,可以设置不同的档位

并发执行可能存在问题

脏读问题

一个事务A在修改数据同时,另一个事务B读取了数据,此时A很可能在提交的时候修改
了B读取的数据,导致事务B读取的数据为无效数据,这种错误操作就是脏读操作

解决方法:在事务提交之前,不能进行读操作,提交之后才能读
也就是对 写操作 加锁

在加锁之前,我的写操作,和同学的读操作就是完全高并发的
但是并发性虽然高,隔离性却是最低的
在加锁之后,写的时候不能进行读操作,并非性降低了,隔离性提高了


不可重复读

在一个事务A中多次读取同一个数据,发现不一样


解决方法: 读数据的时候,不能修改,读加锁

引入读加锁后,并发程度进一步降低了,效率也下降了
但隔离性提高了,数据准确性也提高了


幻读

特殊的不可重复读,对A文件进行读的时候,增加了新文件B
导致读之前的结果集与读之后的结果集不同。

解决方法:

串行执行,效率最低,并发程度最低,此时,隔离性最高,数据的准确性最高。

MySQL的优化措施: REPEATABLE_READ(可重复读)+间隙锁就能解决幻读问题了,不一定要串行化 这样就构造了一个查锁吗,查的数据被锁了,不查的空数据也被锁了

间隙锁:加锁范围是被查询范围内的空隙(未填写数据的空位置),防止查询期间其他事务插入到间隙中,导致读之前的结果集与读之后的结果集不同。


上述
三种情况,不一定是bug,要根据实际需求,需要考虑对特定目标的准确性要求

衡量是不是BUG的唯一标准,就是看是否符合需求


难点解析


1.REPEATABLE_READ(可重复读)给查的数据加上锁,在事务结束之前都不能修改,以此来解决不可重复读问题

2.REPEATABLE_READ(可重复读)+间隙锁就能解决幻读问题了,不一定要串行化
这样就构造了一个查锁吗,查的数据被锁了,不查的空数据也被锁了

3.串行化就是等一个结束了再上另一个事务(类似葫芦娃救爷爷)

4.在串行化隔离级别下,读操作也会被加锁(一般是共享锁),不过在读取数据后就会放开数据,多个事务可以交替读.但是只能由一个事务改,且在写完之前都不能读


哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏
Thanks♪(・ω・)ノ

 

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

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

相关文章

浅析Java设计模式之四策略模式

title: 浅析Java设计模式之四策略模式 date: 2018-12-29 17:26:17 categories: 设计模式 description: 浅析Java设计模式之四策略模式 1. 目录 1. 目录2. 概念 2.1. 应用场景2.2. 优缺点 2.2.1. 优点2.2.2. 缺点 3. 模式结构4. 样例 4.1. 定义策略4.2. 定义具体策略4.3. 定义…

Android内存泄漏总结和性能优化技巧

我们在开发安卓应用时,性能优化是非常重要的方面。一方面,优化可以提高应用的响应速度、降低卡顿率和提升应用流畅度,从而提升用户体验;另一方面,优化也可以减少应用的资源占用,提高应用的稳定性和安全性&a…

【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析

【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析 一、emac_rx_thread_handler():通过POLL 轮询方式获取数据二、emac_rx_poll_mq():调用 pdata->clean_rx() 来处理消息三、emac_configure_rx_fun_ptr():配置 pdata->…

SWUST 派森练习题:P116. 字符统计排序

描述 编写程序:从键盘中输入一段字符,完成以下统计并输出: (1)该段字符中总共出现了多少种不同类型的字符; (2)出现次数最多的前3个字符(只能为字母和数字&#xff0c…

vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件

文章目录 ⭐前言⭐react 组件传值实例💖父组件传值给子组件(props)💖子组件传递事件给父组件props绑定事件💖父组件触发子组件的事件Ref ⭐vue3 组件传值实例💖 父组件传递数据给子组件props💖 …

【论文阅读】SHADEWATCHER:使用系统审计记录的推荐引导网络威胁分析(SP-2022)

SHADEWATCHER: Recommendation-guided CyberThreat Analysis using System Audit Records S&P-2022 新加坡国立大学、中国科学技术大学 Zengy J, Wang X, Liu J, et al. Shadewatcher: Recommendation-guided cyber threat analysis using system audit records[C]//2022 I…

Hlang-中英双语言编程语言使用手册

文章目录 介绍Hlang基本使用下载配置环境变量特性中文关键字支持中文符号混合编程中文错误提示终端多行输入基本数据类型整数浮点数列表字符串基本操作变量定义逻辑判断基本运算条件判断循环函数介绍 Hlang是一款基于Python编写的支持中英文混合编程的动态语言。其简单易上手,…

学C的第三十四天【程序环境和预处理】

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十三天【C语言文件操作】_高高的胖子的博客-CSDN博客 1 . 程序的翻译环境和执行环境 在ANSI C(C语言标准)的任何一种实现中,存在两个不同的环境。 &#xff0…

for循环也能写错?

好开心好开心 可是明明也只是解决了一个不应该要犯错的地方 本来是要在一个大循环中,每一次循环中有30次的另一个循环,然而我写成了这个样子: consensus_iterations 30 for i in range(2):for consensus_iterations in range(consensus_it…

容器虚拟化基础之cgroups/LXC

"你真的,自由了~" 容器虚拟化基础之Cgroups: (1) 什么是cgroups cgroups是 linux 内核提供的一种机制, 这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一…

3D与沉浸式技术,如何助力企业数字化转型?

说起3D,估计许多读者朋友会在第一时间想起《阿凡达》系列和《侏罗纪公园》系列电影大作。每一帧细节纤毫毕现的逼真画面,让观众几乎分不清虚拟与现实,完全沉浸在导演打造的视觉盛宴中。 事实上,除了大家所熟知的3D影视动画之外&am…

查找算法及应用

查找算法及应用 常用查找算法包括顺序/线性查找、二分/折半查找、插值查找、斐波那契查找。 线性查找 逐一比对,发现有相同值返回即可。 二分查找 前提是数组有序。如果数据是连续的情况下可以使用插值查找。 插值查找 插值查找算法类似二分查找,不同的…

快速学习GO语言总结

备注:本博客将自己初步学习GO的总结进行分享,希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力,如有错误请留言指正,谢谢! 一、初步了解Go语言 (一)Go语言诞生的主要问题和目标…

8.3 【C语言】通过指针引用数组

8.3.1 数组元素的指针 所谓数组元素的指针就是数组元素的地址。 可以用一个指针变量指向一个数组元素。例如: int a[10]{1,3,5,7,9,11,13,15,17,19}; int *p; p&a[0]; 引用数组元素可以用下标法,也可以用指针法&#xf…

iOS17 widget Content margin

iOS17小组件有4个新的地方可以放置分别是:Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙,确保内容显示完整。这…

【WinAPI详解】<CreateWindowEx详解>

函数原型: HWND CreateWindowEx(DWORD dwExStyle, //窗口的扩展风格(加强版专有)LPCTSTR lpClassName, //已经注册的窗口类名称LPCTSTR lpWindowName,//窗口标题栏的名字DWORD dwStyle, //窗口的基本风格int x, //窗口左上角水平坐标位置int …

学习设计模式之适配器模式,但是宝可梦

前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 适配器模式 意图:将一个类的接口转换成客户希望的另一个接口 主要解决:把现有对象放到新环境里,而新…

通过C实现sqlite3操作,(增删改查),导入电子词典

一、插入 #include <stdio.h> #include <sqlite3.h> void do_insert(sqlite3 *db); int main(int argc, const char *argv[]) {//创建并打开一个数据库sqlite3 *db NULL;if(sqlite3_open("./mysql.db",&db) ! SQLITE_OK){fprintf(stderr,"sql…

AUTOSAR配置与实践(配置篇)5.1 BSW的通信功能进阶

传送门 -> AUTOSAR配置与实践总目录 AUTOSAR配置与实践(配置篇)5.1 BSW的通信功能进阶 一、模块和收发流程主要配置项介绍1.1 模块介绍1.2 通知方式相关主要配置项二、收发流程详解2.1 发送流程2.2 发送确认过程2.2.1 发送确认过程(读数据方式:轮询)2.2.2 发送确认过程…

IDEA 如何制作代码补丁?IDEA 生成 patch 和使用 patch

什么是升级补丁&#xff1f; 比如你本地修复的 bug&#xff0c;需要把增量文件发给客户&#xff0c;很多场景下大家都需要手工整理修改的文件&#xff0c;并整理好目录&#xff0c;这个很麻烦。那有没有简单的技巧呢&#xff1f;看看 IDEA 生成 patch 和使用 patch 的使用。 介…