八、MySQL事务和SQL优化

1 什么是事务

Transaction,使我们数据库内最小且不可再分的单元。通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。一个完整的业务需要批量的DML(INSERT 、UPDATE、DELETE)语句共同联合完成。事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。

操作序列范畴,这些序列共有的一个特征 要么全部执行,要么全都不执行。这是一个不可分割的工作单元。事务是由事务开始和事务结束之间所执行的数据库操作组成。

#例如以银行转账需求:

家长账户   扣款    -money
学生账户   收款    +money

必要要求 以上两台DML语句必须同时成功或者同时失败。最小单元不可再分,当第一条DML语句执行成功后,并不能将底层数据库中的第一个账户的数据修改,只是将操作进行了记录。这个记录实在内存中完成的,当第二条DML语句执行成功后,和底层数据库文件中的数据再进行完全的同步。反之如果第二条DML语句执行失败,清空所有的历史操作记录,以保证数据的统一。

事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,只有事务完成了提交行为。才意味着数据被永久的保存。

要么数据库管理系统将放弃所有的修改。使整个事务回滚到最初状态。

2 事务的特征

事务的本质是由一组SQL语句组成的逻辑处理单元。

A (原子性Atomicity):原子性是指事务是一个不可分割的最小单元,事务中的操作要么都发生,要么都不发生。

C (一致性Consistency):事务必须使数据库从一个一致性,转变到另一个一致性的状态。

I (隔离性Isolation):多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的事务操作所干扰,要求多个并发事务之间 要相互隔离

D(持久性Durability):持久性指一个事务被提交是,它对于数据库内数据的改变就是永久性的,接下来即便数据库发生故障,也不应该对其有任何影响。

在这里插入图片描述

3 MySQL使用事务

实现

  1. 手动关闭掉一个操作 >>>>>>> 自动提交改变成手动提交
    ​ SET AUTOCOMMIT = 0;

  2. 标记事务的起点
    START TRANSACTION

  3. 编辑并执行 SQL语句 组

  4. 提交
    COMMIT

  5. 回滚
    ROLLBACK

  6. 手动开启掉一个操作 >>>>>>> 手动提交改变成自动提交
    SET AUTOCOMMIT = 0;

实现截图

MySQL 开启事务,回滚,提交。

begin
5.5 以上版本 不需要手动begin,只要你执行的是一个DML,那么它就会自动在前面加入begin命令COMMIT  提交事务
完成了一个事务,一旦事务提交成功,就说明具备了ACID原则ROLLBACK  回滚职务
完成了一个事务,将内存中已执行的操作撤销,并还原成最初状态

示例演示:

#需求  顾客A在线购买了一个商品 价格XXXX元 采用转账方式进行支付
#假设A 存款金额XXXX元,且向卖家B支付购买商品费用
#卖家B 当前账户余额XXXX元#步骤1:创建数据库 shop_db;
CREATE DATABASE shop_db;
#步骤2:创建账户表  账户编号(自增)  账户人   当前账户金额
CREATE TABLE IF NOT EXISTS  `account` (`id` int(11) not null auto_increment,`name` varchar(32) not null,`cash` decimal(9,2) not null,PRIMARY KEY (`id`)
) ENGINE=InnoDB;
#步骤3:通过事务完成转账业务
SET AUTOCOMMIT = 0;START TRANSACTION;
UPDATE account set cash = cash - 1000 WHERE name = 'A';
UPDATE account set cash = cash + 1000 WHERE name = 'B';COMMIT;  #ROLLBACKSET AUTOCOMMIT = 1;#那么当两个事务打开同一个数据库(用户???),数据库原始余额为100;第一个事务将余额改为0,结束了;
#当第二个事务又将余额-50,那么最后结果是多少?   #死锁  必须等待1事务结束后 方可执行2事务内的操作

4 事务的隔离级别

多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

如果不考虑隔离性:

  1. 幻读

  2. 脏读

  3. 不可重复读

幻读

​ 在一个事务内读取到了别的事务插入的数据,导致前后读取的信息不一致

​ 事务A按照自身的约定在进行数据读取,期间事务B插入了相同的搜索条件的新数据,事务A再次按照原先约定条件进行读取时,发现了事务B插入的新数据,幻读。

​ 会造成事务中先产生的锁,无法管理后加入满足条件的行。

如何解决

​ bin_log :产生数据一致性问题,在一个事务中,先对符合条件的目标行做变更,而在事务提交前,有新符合目标条件的加入。通过bin_log 恢复数据会将所有符合条件的目标行进行变更。

​ 间隙锁:在两行记录间的空隙加上锁,防止新纪录的插入。

脏读

​ 事务读取到另一个事务未提交的数据,解决方案 加入乐观锁。

不可重复读

​ 不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据

这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

幻读和不可重复读两者区别

不可重复读 指同一条SQL查询到了不同的结果

幻读指 查询的结果行数不同

事务的隔离级别

描述脏读不可重复读幻读
Read uncommitted
Read committed
Repeatable read
Serializable

5 数据库优化

5.1 影响性能因素的优化
服务优化硬件操作系统网络数据库设计
应用优化应用程序查询事务管理数据分布
5.2 谁参与优化
数据库管理员>
业务部门代表>
架构师>
应用程序设计开发人员>
硬件及系统管理员>
存储管理员。。。
5.3 系统优化
软件优化开发系统(操作系统)MYSQL编译优化
硬件优化CPU 内存 硬盘 网卡
5.4 服务优化
Mysql配置配置合理的Mysql服务器,尽量在应用本身达到一个合理的使用针对于不同的搜索引擎,定制不同的配置针对于不同的情况和需求,进行合理的配置my.cnf进行配置。
5.5 MyISAM配置项
选项缺省值推荐值说明
key_buffer_size8M128M–256M用来存放索引区块的缓存值, 建议128M以上,不要大于内存的30%
read_buffer_size128k10-20M用来做MyISAM表全表扫描的缓冲大小.
myisam_sort_buffer_size16M128M设置,恢复,修改表的时候使用的缓冲大小
5.6 InnoDB配置项
选项缺省值推荐值说明
innodb_buffer_pool_size32M1GInnoDB使用一个缓冲池来保存索引和原始数据, 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少,一般是内存的一半,不超过2G,否则系统会崩溃,这个参数非常重要
innodb_additional_mem_pool_size2M128MInnoDB用来保存 metadata 信息,如果内存是4G,最好本值超过200M
innodb_flush_log_at_trx_commit100 代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘; 1 为执行完没执行一条SQL马上commit; 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上. 对速度影响比较大,同时也关系数据完整性
innodb_log_file_size8M128M在日志组中每个日志文件的大小, 一般是innodb_buffer_pool_size的25%,官方推荐是innodb_buffer_pool_size 的 40-50%, 设置大一点来避免在日志文件覆写上不必要的缓冲池刷新行为
innodb_log_buffer_size128K8M用来缓冲日志数据的缓冲区的大小.推荐是8M,官方推荐该值小于16M,最好是 1M-8M 之间
5.7 应用优化
库表设计原则选择合适的数据类型:如果能够定长尽量定长使用 ENUM 而不是 VARCHAR,ENUM类型是非常快和紧凑的,在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美 。不要使用无法加索引的类型作为关键字段,比如 text类型为了避免联表查询,有时候可以适当的数据冗余,比如邮箱、姓名这些不容易更改的数据选择合适的表引擎,有时候 MyISAM 适合,有时候InnoDB适合为保证查询性能,最好每个表都建立有 auto_increment 字段, 建立合适的数据库索引最好给每个字段都设定 default 值
索引建立原则(一)一般针对数据分散的关键字进行建立索引,比如ID、QQ,•  像性别、状态值等等建立索引没有意义字段唯一,最少,不可为null对大数据量表建立聚集索引,避免更新操作带来的碎片。尽量使用短索引,一般对int、char/varchar、date/time 等类型的字段建立索引需要的时候建立联合索引,但是要注意查询SQL语句的编写谨慎建立 unique 类型的索引(唯一索引)大文本字段不建立为索引,如果要对大文本字段进行检索,可以考虑全文索引(引擎问题)频繁更新的列不适合建立索引    
索引建立原则(二)order by 字句中的字段,where 子句中字段,最常用的sql语句中字段,应建立索引。 唯一性约束,系统将默认为改字段建立索引。对于只是做查询用的数据库索引越多越好,但对于在线实时系统建议控制在5个以内。索引不仅能提高查询SQL性能,同时也可以提高带where字句的update,Delete SQL性能。Decimal 类型字段不要单独建立为索引,但覆盖索引可以包含这些字段。只有建立索引以后,表内的行才按照特地的顺序存储,按照需要可以是asc或desc方式。如果索引由多个字段组成将最用来查询过滤的字段放在前面可能会有更好的性能。
编写高效的 SQL (一)能够快速缩小结果集的 WHERE 条件写在前面,如果有恒量条件,也尽量放在前面尽量避免使用 GROUP BY、DISTINCT 、OR、IN 等语句的使用,避免使用联表查询和子查询,因为将使执行效率大大下降能够使用索引的字段尽量进行有效的合理排列,如果使用了联合索引,请注意提取字段的前后顺序针对索引字段使用 >, >=, =, <, <=, IF NULL和BETWEEN 将会使用索引,如果对某个索引字段进行 LIKE 查询,使用 LIKE  ‘%abc%’不能使用索引,使用 LIKE ‘abc%’将能够使用索引    如果在SQL里使用了MySQL部分自带函数,索引将失效,同时将无法使用 MySQL 的 Query Cache,比如 LEFT(), SUBSTR(), TO_DAYS(),DATE_FORMAT(), 等,如果使用了 OR 或 IN,索引也将失效使用 Explain 语句来帮助改进我们的SQL语句
编写高效的 SQL (二)不要在where 子句中的“=”左边进行算术或表达式运算,否则系统将可能无法正确使用索引尽量不要在where条件中使用函数,否则将不能使用索引避免使用 select *, 只取需要的字段对于大数据量的查询,尽量避免在SQL语句中使用order by 字句,避免额外的开销如果插入的数据量很大,用select into 替代 insert into 能带来更好的性能采用连接操作,避免过多的子查询,产生的CPU和IO开销只关心需要的表和满足条件的数据适当使用临时表或表变量对于连续的数值,使用between代替inwhere 字句中尽量不要使用CASE条件尽量不用触发器,特别是在大数据表上更新触发器如果不是所有情况下都需要触发,应根据业务需要加上必要判断条件   使用union all 操作代替OR操作,注意此时需要注意一点查询条件可以使用聚集索引,如果是非聚集索引将起到相反的结果当只要一行数据时使用 LIMIT 1尽可能的使用 NOT NULL填充数据库拆分大的 DELETE 或 INSERT 语句批量提交SQL语句

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

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

相关文章

Js设计模式

1、简介 设计模式总的来说是一个抽象的概念&#xff0c;是软件开发人员在开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 2、工厂模式 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对…

计算机设计大赛 基于图像识别的跌倒检测算法

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于图像识别的跌倒检测算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

金融行业现场故障处理实录

KL银行现场服务记录—HA故障 服务时间 2019年9月10日星期二 14&#xff1a;40 到2019年9月11日星期三 0&#xff1a;30 服务内容 排查redhat RHEL 6.4 一个节点cman启动故障。 &#xff08;1&#xff09;、查看系统日志&#xff1b; &#xff08;2&#xff09;、查看ha日志…

跟着pink老师前端入门教程-day13

品优购案例 一、品优购项目规划 1. 品优购项目整体介绍 项目名称&#xff1a;品优购 项目描述&#xff1a;品优购是一个电商网站&#xff0c;我们要完成 PC 端首页、列表页、注册页面的制作 2. 品优购项目学习目的 1. 电商类网站比较综合&#xff0c;里面需要大量的布…

如何使用Python Flask搭建一个web页面并实现远程访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

2014年苏州大学837复试机试C/C++

2014年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…

linux 运行vue项目

1&#xff1a;在本地电脑 项目跟目录 执行 npm run build 在根目录生成文件夹 dist 2&#xff1a;复制dist 到linux 上 /usr/vuespace/ledger-web/dist 3: 配置nginx server {listen 443 ssl;server_name tz.i569.cn; #填写绑定证书的域名ssl_certificate /etc/nginx/myconf…

如何搭建开源笔记Joplin服务并实现远程访问本地数据

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

【STM32】快速搭建工程

1. 快速生成工程 2.下载DFP包或者根据已有DFP包安装 3.拷贝现有工程的操作系统&#xff0c;应用层代码 debug 就完成最新工程的快速搭建 4.编译发现如下图 5.修改完这个报错&#xff0c;新工程建立基本完成&#xff0c;如果有其他错误&#xff0c;缝缝补补就可 比如 Main.c文…

广联达-EmailAccountOrgUserService-sql注入漏洞复现

产品简介 广联达OA是一款为企业提供综合办公解决方案的软件。它集成了多种功能&#xff0c;包括文档管理、流程审批、任务分配等&#xff0c;旨在提高企业内部的工作效率和协作能力。同时&#xff0c;广联达OA还注重安全性&#xff0c;通过多种措施保护企业数据和信息的安全。…

微博怎么把客户引流到私域?(引流技巧)

微博 1&#xff09;背景banner图 在微博主页顶部的背景图里&#xff0c;可以引导添加个人微信、公众号等信息&#xff0c;通常配合福利引导用户添加。 2&#xff09;个人简介 微博中比较常见的引流方式&#xff0c;可以直接在简介区内留下微信号、公众号名称、邮箱等信息&#…

[algorithm] 自动驾驶 规划 非线性优化学习系列之1 :车辆横向运动动力学详细解释

写在前面 最近时空联合规划很火&#xff0c;想学习。由于在学校主打学习新能源电力电子方向&#xff0c;转行后也想好好零散的知识体系。计划从车辆运动动力学习&#xff0c;模型预测控制&#xff08;经典控制目前看主打应用&#xff0c;不会再去深入&#xff09;&#xff0c;…

【方法论】费曼学习方法

费曼学习方法是由诺贝尔物理学奖得主理查德费曼提出的一种学习方法。这种方法强调通过将所学的知识以自己的方式解释给别人来提高学习效果。 费曼学习方法的步骤如下&#xff1a; 选择一个概念&#xff1a;选择一个要学习的概念或主题。 理解和学习&#xff1a;用自己的方式学…

Ubuntu本地部署Nextcloud并结合内网穿透实现远程访问搭建个人云盘

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访…

【服务器APP】利用HBuilder X把网页打包成APP

目录 &#x1f33a;1. 概述 &#x1f33c;1.1 新建项目 &#x1f33c;1.2 基础配置 &#x1f33c;1.3 图标配置 &#x1f33c;1.4 启动界面配置 &#x1f33c;1.5 模块配置 &#x1f33c;1.6 打包成APP &#x1f33a;1. 概述 探讨如何将网页转化为APP&#xff0c;这似乎…

[嵌入式系统-4]:龙芯1B 开发学习套件-1-开发版硬件介绍

目录 前言&#xff1a; 一、龙芯 1B 开发学习套件简介 1.1 概述 二、龙芯1B 200开发板硬件组成与接口介绍 2.1 概述 2.2 核心板 2.2.1 CPU 2.2.2 什么是核心板 2.2.3 龙芯1B 200核心板 2.2.4 龙芯1B核心板的接口定义 2.3 开发板 2.3.1 龙芯1B0200开发板 2.3.2 龙芯…

如何使用Everything随时随地远程访问本地电脑搜索文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

【前沿技术杂谈:解释性人工智能】透视未来:解释性人工智能(XAI)在构建透明、可信AI世界中的角色

【前沿技术杂谈&#xff1a;解释性人工智能】透视未来&#xff1a;解释性人工智能&#xff08;XAI&#xff09;在构建透明、可信AI世界中的角色 引言揭开可解释性人工智能的面纱&#xff1a;定义、重要性与应用什么是可解释性AI&#xff1f;定义XAIXAI的目标 为什么需要可解释性…

智能水龙头行业研究:预计2028年将达到4.8亿美元

智能水龙头(智能水龙头)一般指智能感应水龙头。智能感应水龙头&#xff0c;智能节水&#xff1a;自动感应控制开、关&#xff0c;将手或盛水容器、洗涤物品伸入感应范围内&#xff0c;龙头即自动出水&#xff0c;离开后即停止出水。这种智能水龙头&#xff0c;伸手就来水&#…

Kotlin快速入门5

Kotlin的继承与重写 kotlin的继承 Kotlin中所有类都继承自Any类&#xff0c;Any类是所有类的超类&#xff0c;对于没有超类型声明的类是默认超类&#xff08;Any 不是 java.lang.Object&#xff09;&#xff1a; class LearnKotlin // 默认继承自Any Any类默认提供三个函数…