数据库事务AICD以及隔离级别

news/2024/4/30 19:15:19/文章来源:https://blog.csdn.net/a347635191/article/details/129107612

目录

      • 一.事务的ACID
      • 二.隔离级别
      • 三.并发事务中的问题
        • 1.脏写
        • 2.脏读
        • 3.不可重复读
        • 4.幻读
      • 四.MVCC机制
      • 五.读锁与写锁
      • 六.大事务的影响
      • 七.事务优化

一.事务的ACID

  • 原子性(Atomicity):一个事务中的所有操作,要么全部成功,要么失败全部回滚,不会结束在某个中间环节。原子性由undo log日志来实现
  • 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。由其他三个特性及业务代码正确逻辑来实现
  • 隔离性((Isolation):一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。隔离性由MySQL各种锁以及MVCC机制来实现
  • 持久性(Durable):一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,即使系统故障也不会丢失。持久性由redo log日志来实现

二.隔离级别

InnoDB引擎定义了四种隔离级别,级别越高事务隔离性越好,但性能就越低

  • read uncommit(读未提交),事务A读取到了事务B已经修改但尚未提交的数据
  • read commit(读已提交):Oracle和SQL Server的默认隔离级别,一个事务只能看见已经提交事务所做的改变
  • repeatable read(可重复读):MySQL的默认隔离级别,无论事务B如何修改数据,事务A内部相同查询语句在不同时刻查询出来的结果都是一致的,即在第一次查询之后就不会发生变化(除非事务A更新了这行数据,由快照读变为当前读)
  • serializable(串行化) :所有事务对同一条数据的读和写只允许串行执行,解决了脏读、不可重复读、幻读的问题
隔离级别脏写脏读不可重复读幻读
read uncommit
read commit
repeatable read
serializable

✔表示存在此并发问题,❌表示不存在

三.并发事务中的问题

account表(只有一条id为1的数据)
在这里插入图片描述

表结构

CREATE TABLE `account` (`id` int(11) NOT NULL,`balance` int(11) NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.脏写

事务A对一行数据进行修改,之后事务B也修改了同一行数据,事务A进行回滚,由于undo日志记录的是事务A修改这行数据的反向操作(执行insert就会记录delete),数据就会恢复到A修改前的初始状态
所有的隔离级别都不会出现脏写的问题,因为事务A更新数据的时候,会对更新的行记录加写锁,除非事务A提交或者回滚,否则事务B因获取不到锁,从而不能更新这行数据

2.脏读

事务A读取到了事务B已经修改但尚未提交的数据

  • 1.事务B将序号1的余额增加500但未提交
    set tx_isolation = 'read-uncommitted';
    begin;
    update account set balance = balance + 500 where id = 1;
    
  • 2.事务A读取到序号1的余额为500
    set tx_isolation = 'read-uncommitted';
    select * from account where id = 1;
    
  • 3.事务B回滚之前增加余额的操作,那么事务A读取到的数据就是脏数据
    rollback;
    

3.不可重复读

事务A内部相同查询语句在不同时刻查询出来的结果不一致

  • 1.事务A查询序号1的余额为0
    set tx_isolation = 'read-committed';
    begin;
    select * from account where id = 1;
    
  • 2.事务B将序号1的余额增加500并提交
    set tx_isolation = 'read-committed';
    begin;
    update account set balance = balance + 500 where id = 1;
    commit;
    
  • 3.事务A再次查询序号1的余额为500
    select * from account where id = 1;
    commit;
    

4.幻读

事务A读取到了事务B新增且已经提交的数据

  • 1.事务A读取表中所有数据,发现只有一条id为1的数据,select会生成快照读(之后再读同一行数据会从历史版本读取)
    set tx_isolation = 'repeatable-read';
    begin;
    select * from account;
    
  • 2.事务B往表中添加一条id为2的记录并提交
    set tx_isolation = 'repeatable-read';
    begin;
    select * from account;
    
  • 3.事务A读取表中所有数据,发现还是只有一条id为1的数据(证明已解决不可重复读的问题)
    select * from account;
    
  • 4.事务A更新表中所有数据(余额都加500)
    update account set balance = balance + 500;
    
  • 5.事务A读取表中所有数据,发现突然多出来一条id为2的数据(好像幻觉一样),这是因为之前修改到了id为2的数据,快照读变成了当前读,会读取当前最新数据
    update account set balance = balance + 500;
    select * from account;
    commit;
    

四.MVCC机制

MVCC(Multi-Version Concurrency Control)多版本并发控制,就可以做到读写不阻塞(多个事务的读和写操作可以并行执行),且避免了类似脏读的问题,主要通过undo日志链来实现

  • select操作是快照读(历史版本)
  • insert、update和delete是当前读(当前版本)
  • read commit(读已提交),语句级快照
  • repeatable read(可重复读),事务级快照

五.读锁与写锁

  • 读锁(共享锁)
    读锁是共享的,多个事务可以读取同一个资源,但不允许其他事务修改,语法是select … lock in share mode;
  • 写锁(排它锁)
    写锁是排它的,会阻塞其他的写锁和读锁,update、delete、insert,语法是select … for update;

六.大事务的影响

  • 并发场景下,数据库连接池容易被撑爆
  • 锁定太多的数据,造成大量的阻塞和锁超时
  • 执行时间长,容易造成主从延迟
  • 回滚所需要的时间比较长
  • undo日志膨胀
  • 容易导致死锁

七.事务优化

  • 尽量将查询等数据准备操作放到事务外
  • 事务中避免远程调用,远程调用要设置超时,防止事务等待时间太久
  • 事务中避免一次性处理太多数据,可以拆分成多个事务分次处理
  • 更新等涉及加锁的操作尽可能放在事务靠后的位置
  • 为了保证数据的一致性,以非事务的方式执行

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

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

相关文章

linux集群技术(一)--LVS(负载均衡)(一)

集群功能分类负载均衡LVS概述LVS工作模式轮训算法 1.集群功能分类 1.1 LB (一)简介 LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的…

「文档数据库之争」MongoDB和CouchDB的比较

MongoDB和CouchDB都是基于文档的NoSQL数据库类型。文档数据库又称mdocument store,通常用于存储半结构化数据的文档格式及其详细描述。它允许创建和更新程序,而不需要引用主模式。移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段。Mong…

SSH 服务支持弱加密算法

漏洞扫描有SSH 服务支持弱加密算法,解决方案有两个: 方案一:修改 SSH 配置文件,添加加密算法: vi /etc/ssh/sshd_config 最后添加一下内容(去掉 arcfour、arcfour128、arcfour256 等弱加密算法)…

游戏服务器算法-AOI基本介绍

一、直接比较所有对象 最直观也是最效率最低的一种方法。当一个事件发生,我们需要获得AOI范围以内的物体时,直接遍历游戏中所有的对象,并且进行坐标判断,如果小于或者等于AOI的范围,则为需要的游戏对象。 这种方法实…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础,以服务于全校师生的教学、科研、生活为目的,建立在学校数据中心平台之上,涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…

积分球原理及积分球类型介绍

标题积分球标准型积分球LED积分球均匀光源便携式高亮度积分球均匀光源微光积分球均匀光源积分球均匀光源iSphere高光谱响应光学积分球其他分类积分球 积分球原理:由于球体内整涂有白色漫反射材料的空腔球体,球壁上开有采样口,当待测样品光源进入积分球的…

公司缺人面了8个测试员,他们都有一个相同的缺点.....

年后公司缺人,面了不少测试,结果竟然没有一个合适的。 一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。 看简历很多都是3年工作经验,但面…

约束优化:约束优化的三种序列无约束优化方法(罚函数法)

文章目录约束优化:约束优化的三种序列无约束优化方法(罚函数法)外点罚函数法L2-罚函数法:非精确算法对于等式约束对于不等式约束L1-罚函数法:精确算法内点罚函数法:障碍函数法参考文献约束优化:…

Docker实用命令手册

Docker实用命令手册 大家好,我是比特桃。本文汇总了超实用的Docker命令手册,本文适用于有一定Docker基础的同学。如果你对Docker不了解,可能无法直接使用这些命令。但别担心,Docker本身是一个工具,如果只是用起来其实…

算法专题训练营

动归算法专题 1.拆分词句 是不是,在不在都是可以用动归解决的 状态转义方程不一定都是等式,也有可能是条件 2.三角形 动归算法也不是一定要借助新开空间,也是可以用自己原来的空间 3.背包问题 4.分割回文串-ii 5.不同的子序列 贪心算法专题 只管一步的最优结果, 1.分割平衡…

高并发系统设计之负载均衡

本文已收录至Github,推荐阅读 👉 Java随想录 文章目录DNS负载均衡Nginx负载均衡负载均衡算法负载均衡配置超时配置被动健康检查与主动健康检查LVS/F5Nginx当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到…

Navicat Premium 安装 注册

Navicat Premium 一.Navicat Premium的安装 1.暂时关闭windows的病毒与威胁防护弄完再开,之后安装打开过程中弹窗所有警告全部允许,不然会被拦住 2.下载安装包,解压 链接:https://pan.baidu.com/s/1X24VPC4xq586YdsnasE5JA?pwdu4vi 提取码…

论文阅读 | Real-Time Intermediate Flow Estimation for Video Frame Interpolation

前言:ECCV2022 快速插帧方法 Real-Time Intermediate Flow Estimation for Video Frame Interpolation 引言 进行视频插帧目前比较常见的方法是基于光流法,分为两个步骤:1.通过光流对齐输入帧,融合对齐的帧 光流并不能直接同于…

epoll 笔记

maxevents 参数大小一般不超过64必须够了 maxevents 个事件,才会传到用户空间吗?可见,只要有事件就可以传到用户空间。一台服务器可以支撑多少个链接https://blog.csdn.net/mijichui2153/article/details/81331345 0、两台虚拟机的初始状态如…

亮个相吧小宝贝儿,五款压箱底的软件

今天要给大家推荐5款压箱底的宝贝软件了,百度搜索一下就能找到下载链接了。 1.开源浏览器——Firefox Firefox是一个自由的,开放源码的浏览器,适用于 Windows, Linux 和 MacOS X平台,Mozilla Firefox官方版体积小速度快&#xf…

rocketmq延时消息自定义配置

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分: nameserver:保存路由信息broker:保存消息生产者:生产消息消费者:消费消息 延时消息的处理是在其中的broker中。 但是…

堆球问题,开普勒猜想(格密码相关)

目录 一. 介绍 二. 历史进展分析 三.2维下的堆球问题 四. 3维下的堆球问题 五. 8维与24维下的堆球问题 总结 一. 介绍 堆球问题又叫堆球理论、最密堆积、球填充,英文为The Theory Of Sphere Packings。 堆球问题的本质就是填充一堆大小相同的球。要求这些球…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后,Yield Guild Games 现在推出了第三季的公会发展计划(GAP)。GAP 在第二季有了显著的增长,有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议,下一次迭代将…

pmp考试是什么?适合哪些人学?含金量?(含pmp资料)

先说一下我这个人的理解,PMP就是提高项目管理理论基础和实践能力的考试。 再说说PMP官方一点的说明: PMP证书全称为Project Management Professional,也叫项目管理专业人士资格认证。PMP证书由美国项目管理协会(PMI)发起,是严格…

美国原装二手keysight E4980A(安捷伦)2MHZ LCR表

Agilent E4980A、Keysight E4980A、LCR 表,20 Hz - 2 MHz E4980A 是 Agilent 的 2 MHz LCR 表。LCR表是一种电子测试设备,用于测量电子元件的电感(L)、电容(C)和电阻(R)。LCR 表可…