MySQL事务原理与优化最佳实践

听课问题

  1. 除了读未提交,有一个事务对一条数据进行了修改,但是另外又有一个没有加事务的查询sql,那么读取到的数据是原始数据还是没提交的数据。

答案:没加事务的查询读取的是老数据,等事务提交以后就会读取新修改的数据

  1. 除了读未提交,事务A修改一个 id = 5的数据之后没提交,事务B进来也修改相同id = 5的数据,那么会是什么现象? 是可以提交还是等待事务A提交或者回滚之后进行操作

答案: 会等待A事务修改完以后B再执行修改

ACID

A:原子性

在一个事务中要不全部成功要不全部失败。比如事务A中有两个update 第一个update A表 第二个update B表。那么这两个update语句要么全部成功,要么有一个失败另外一个就回滚掉。

C:一致性

  1. 从一个有效状态改为另外一个有效状态。需要其他三个特性共同维持。更是一种达到某种目的的约束,
  2. 比如A有500,B有100.那么A要给B转钱500,那么A减100,B加100,但是如果A成功了变成400,B失败了还是100没加上,这时候凭空少了100肯定是不行的,那么就需要使用原子性,B加100失败了连着A也一起回滚掉。
  3. 如果仅仅有原子性的情况,假设C也要给A转钱100并且成功提交了(此时A还没回滚但是减了100),而A给B转钱因为B失败了要回滚到500,C已经给A了100那么A应该有600,但是C当时读到了的是已经减去了100的A也就是400,加了100变为500,A又因为B失败回滚到了500,导致C凭空消失了100元A也没加上这100,这时候应该有隔离性,A没提交C要修改A的数据就要等待因为有读锁。
  4. 如果只有原子性+隔离性:当A数据库宕机了,数据都没了那么肯定保证不了一致性,这时候就会写到硬盘,持久化,再次开机还是有原本已经提交过的数据。

I: 隔离性

数据之间的数据是相互隔离的。其中有隔离级别分别为:读未提交、读已提交、可重复读、串行化

其中这四种隔离界别会导致四种问题:脏读、不可重复读、幻读、脏写

隔离级别分别造成的四种问题

脏读

一个事物读取到了另外一个事务没有提交的数据。

不可重复读

一个事务,第一次查询该条数据和第二次查询该条数据不一致

幻读

假设表A中有id = 1、2、3;三条数据,事务A查询A表中数据,是三条数据,这时候事务A不提交

事务B新增一条数据id = 4;成功提交

事务A再次查询其实还是三条数据,但是如果修改id = 4的数据,会直接修改掉。看不到id = 4的数据却能修改。

有一个概念: 查询时是redolog,修改时是当前数据。比如:事务A第一次id = 1的account = 10,这时候其他事务修改了并且提交了account = 20。 事务A再次查询id = 1的数据account 还是 10,如果这时候 事务A写一个update A set account = account + 10 where id = 1; 之后再去查询 account 竟然变为了 30。修改数据以后就会刷新数据,并且使用当前表最新数据进行修改

脏写

假设是读已提交。两个事务分别为A事务和B事务,A事务读取id = 1的数据 得到account = 10并且在原有基础上加20,没提交。
B事务修改A事务id=1的数据account = 20,因为是读写锁不互斥B可以修改并且提交了,A事务在Java代码中直接取到了10+20 = 30 update 表 set account = 30 where id= 1;这样account变为了30,但是人家原有的事务B已经把account改为了10并且提交了,B事务怎么还是拿的account=10进行计算的呢?

读未提交(有脏读、不可重复读、幻读问题)

两个事务分别为A事务,B事务。A事务进行了update A 将A表的account = 10 修改为了account = 20。事务A还没提交,这时候事务B读取数据读到了20之后在Java代码进行操作。而事务A又因为其他的失败了导致了回滚又到了10,这时候B读取的肯定是错误的。

读已提交(有不可重复读、幻读问题,解决脏读)

两个事务分别为事务A,事务B。事务B读取select * from A where id= 1;不提交,当事务A修改了A表中 update A set account = account + 10 where id = 1;时还没提交,事务B再次查询id = 1 的数据,那么和第一次读取到的数据是一样的,即使第一次读取完以后,事务A修改了id = 1 的数据但是没有提交,事务B第二次读取数据依然是第一次读取的而不是修改过的数据,但是如果事务A提交了,那么事务B第二次查询就会导致和第一次不一致,这也就是不可重复读。解决了脏读,因为没提交的数据读取不到。

可重复读(有幻读问题,解决脏读、不可重复读)

两个事务分别为事务A、事务B。当事务A查询A表中id = 1 的数据得出account = 10,不提交。事务B修改A表中id=1的account = 10 成功后提交。事务A还没提交事务再次查询,这时候会和第一次查询一样,不管其他事务如何修改该数据并且提交,当前事务查询到的数据和第一次都是一致的。但是如果新增数据

串行化(解决脏读、不可重复读、幻读)

单线程,多个事务:事务A、事务B、事务C、事务D他们依次开始进来开启事务,那么事务A先执行完毕在执行事务B再就是C、D。这样就保证了

怎么解决脏写

在Java中比如开启事务,修改表A中account原有基础+10;A表原有account = 20;

错误逻辑

  1. 先 查询 select account from A where id = 1;
  2. 拿到了account java代码进行计算 + 10 = 30;
  3. 在修改 update A set account = 30 where id = 1;
  4. 在查询完成以后其他事务如果对account 进行了修改 已经不是20了,那么就会出现问题。

正确逻辑

直接从数据库中拿数据

update A set account = account + 10 where id = 1;

此时事务是修改读取当前数据,查询读取redolog数据,肯定就是最新的数据进行累计+10;

D:持久性

写入了硬盘,即使MySQL宕机,重启了数据依然存在

事务问题定位

#查询执行时间超过1秒的事务

SELECT

*

FROM

information_schema.innodb_trx

WHERE

TIME_TO_SEC( timediff( now( ), trx_started ) ) > 1;

#强制结束事务

kill 事务对应的线程id(就是上面语句查出结果里的trx_mysql_thread_id字段的值)

事务的注意点和优化

  1. 不适用长事务,比如事务中很多操作修改、查询而且又慢,这时候会加锁导致其他事务来修改数据时等待。影响其他程序
  2. 修改尽量放到后面,因为如果修改放前边就会占用这把锁,必须等提交才能释放,其他事务就要等待,如果最后修改,会减少占用锁的时间,从而减少其他程序的锁等待。
  3. 使用远程调用设置超时时间,因为如果时间太久,事务一直不提交其他事务就要等待
  4. 尽量将查询操作放到事务以外
  5. 事务中避免一次性做很多操作,可以拆分多个事务
  6. 能异步尽量异步

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

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

相关文章

高通平台开发系列讲解(USB篇)DWC3控制USB速率

文章目录 一、设备树二、相关结构体三、最大速率设置四、当前速率设置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB DWC3控制USB速率。 一、设备树 目录:msm-4.14/arch/arm64/boot/dts/qcom/sdxprairie-usb.dtsi dwc3@a600000 {compatibl…

为什么谷歌索引的页面数量会变少?

不知道大家是否会经常关注谷歌站长工具(GSC)中的页面索引报告,关注谷歌优化的人可能会时常查看该报告。通过该报告可以查看哪些网页已经编入索引,哪些网页还未编入索引以及未被编入索引的原因。那么今天就来讲下如何诊断收录问题并…

通过myBatis将sql语句返回的值自动包装成一个java对象(2)

1.之前我们是如何执行一个sql语句自动包装成一个java对象呢? 1.创建一个mapper.xml,定义 执行的语句名字 和 包装成什么类 2.在总的配置文件里申明这个mapper 3.在java里通过sqlSession执行mapper里定义好的内容 我们还可以使用另一种方法实现第三步。现…

md5使用教程

md5使用教程 简单介绍: MD5,全称Message-Digest Algorithm 5,是一种被广泛使用的密码散列函数,可以生成一个128位(16字节)的散列值(hash value),通常用32位的十六进制数表…

java如何修改windows计算机本地日期和时间?

本文教程,主要介绍,在java中如何修改windows计算机本地日期和时间。 目录 一、程序代码 二、运行结果 一、程序代码 package com;import java.io.IOException;/**** Roc-xb*/ public class ChangeSystemDate {public static void main(String[] args)…

快速更改flutter已有项目的项目名称和id等

如果你使用了别人已有的仓库模板或者想更改现有项目的名称,是一件非常繁琐的工作,需要修改全平台的文件还是相当麻烦的,所以这里推荐一个小工具,可以帮助大家快速实现更改项目名称的目的,这个工具地址:rena…

MySQL 5.x与8.X 版本差异

MySQL 5.x与8.x 版本之间存在多个重要差异和改进,以下是一些主要的更新内容: 性能改进 MySQL 8.0在查询优化器、并发控制、内存管理和缓存机制等方面进行了显著的性能提升,从而提高了整体处理能力和响应速度。 JSON支持增强 MySQL 5.x对JSON的…

任务14:使用MapReduce提取全国每年最低/最高气温

任务描述 知识点: 使用MapReduce提取数据 重 点: 开发MapReduce程序统计每年每个月的最低气温统计每年每个月的最高气温 内 容: 使用IDEA创建一个MapReduce项目开发MapReduce程序使用MapReduce统计每年每个月的最低气温使用MapReduce…

正则表达式和爬虫

目录 一、正则表达式: 作用: 字符类(只匹配一个字符) 细节 预定义字符字符(只匹配一个字符) 细节 数量词 二、爬虫 Pattern Matcher 要点说明 一、正则表达式: 作用: 1、校验字符…

pytorch集智-5手写数字识别器-卷积神经网络

1 简介 简称:CNN,convolutional neural network 应用场景:图像识别与分类(CNN),看图说话(CNNRNN)等 优越性:和多层感知机相比,cnn可以识别独特的模式&…

【经验总结】使用静态库编译静态库的方法

一,简介 本文主要介绍,如何使用静态库编译生成另外一个静态库的方法。由于编译静态库不能直接链接静态库,需要将静态库解压成.o文件,然后将解压之后的.o文件,连同其他.o文件一起打包成为.a文件。 二,操作…

Kubernetes (K8S) 3 小时快速上手 + 实践

1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通…

二叉树:从基础结构到高级遍历技术

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言结构定义接口需求构建二叉树销毁二叉树计算节点和叶子的数量二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数 二叉树查找值为x的节点二叉树的…

立白科技集团:研发安全推动数字化蜕变,日化业务再上新高度

立白科技集团成立于1994年,是我国日化行业的领军企业,致力于成为一家“品牌引领、数字经营、富有创新、富有活力”的智慧服务型企业。从2018年开始,立白科技集团加速数字化转型,打造数据和业务中台,并建立toB和toC平台…

修改和调试 onnx 模型

1. onnx 底层实现原理 1.1 onnx 的存储格式 ONNX 在底层是用 Protobuf 定义的。Protobuf,全称 Protocol Buffer,是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时,用户需要先写一份数据定义文件,再根据这份定义文…

【Android Studio】使用简单的adb命令远程连接设备进行调试以及文件推送

在使用Android Studio开发时候遇到设调试的时候,由于需要调试的设备不是这种移动设备,需要连接线路到电脑上很不方便操作,后面发现可以通过远程连接的方式,减少不必要的操作复杂度。 一、找到项目中adb配置的工具位置 一般情况下…

使用 rinetd 搭建简单端口重定向服务

rinetd是什么 rinetd(Redirector for TCP connections)是一个用于重定向TCP连接的工具。它允许你将传入的TCP连接从一个指定的IP地址和端口号重定向到另一个地址和端口号。rinetd通常用于端口重定向,使得可以将流量从一个端口转发到另一个端…

【C语言】指针知识点笔记(2)

目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

Vue响应式系统(二)

Vue响应式系统(一) 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢?听我娓娓道来。 就用Vue.js来说吧,Vue.js的渲染函数就是在effect中执行的: /*Foo组件*/ const Foo {render() {return /*.....*/} }// effect中执行Foo组件中…

kubectl与 jq的另外一些用法

背景: 在日常运维工作中,我们需要管理和操作大量的配置文件,这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象,它用于存储应用的配置信息。有时,我们需要查找哪些 Confi…