事务和函数索引

事务

事务的定义

        事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。

事务的特点

        一个事务中如果有一个数据库操作失败,那么整个 事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。

事务的限制

MySQL数据库中仅InnoDBBDB类型的数据库表 支持事务

事务的ACID原则

1、原子性:意味着数据库中的 事务执行是作为原子粒度。即不可再分,整个语句要么 执行,要么不执行

2、一致性:即在事务开始之前和 事务结束以后,数据 库的完整性约束没有 被破坏。

3、隔离性:事务的执行是互不 干扰的,一个事务 不可能看到其他事 务运行时,中间某 一时刻的数据。

4、持久性:意味着在事务完成以后 ,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会 被回滚。

事务的原子性、一致性、持久性

        事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。

REDO LOG(重做日志)

        REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性

UNDO LOG(回滚日志)

        UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性

事务的隔离性

        通常数据库里都是采用的机制,保证事务之间的隔离性。

MySql中的锁

锁的分类

1、基于锁的属性分类:共享锁(读锁、S锁)、排他锁(写锁、X锁)

2、基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)

3、基于锁的状态分类:意向共享锁、意向排它锁。

事务并发时出现的问题
1.脏写( Dirty Write )

        对于两个事务 Session A、Session B,如果事务Session A 修改了 另一个 未提交 事务Session B 修改过 的数据,那就意味着发生了 脏写

2.脏读( Dirty Read )

        对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效 的

3.不可重复读( Non-Repeatable Read )

        对于两个事务Session A、Session B,Session A 读取 了一个字段,然后 Session B 更新 了该字段。 之后Session A 再次读 同一个字段, 值就不同了。那就意味着发生了不可重复读。注意,不可重复读不一定就是不好的,要看使用的场景。

4.幻读( Phantom )

        对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中 插入 了一些新的行。 之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。

        Session A中的事务先根据条件 studentno > 0这个条件查询表student,得到了name列值为'张三'的记录;之后Session B中提交了一个 隐式事务 ,该事务向表student中插入了一条新记录;之后Session A中的事务再根据相同的条件 studentno > 0查询表student,得到的结果集中包含Session B中的事务新插入的那条记录,这种现象也被称之为 幻读 。我们把新插入的那些记录称之为 幻影记录 。

事务的隔离级别

        事务并发问题: 在事务并发执行的时候,如果不进行事务隔离,那么就会产生脏写脏读不 重复读幻读的问题。

        事务的隔离级别:

READ_UNCOMMITTED读未提交
READ_COMMITTED读提交(不可重复读)
REPEATABLE_READ可重复读
SERIALIZABLE串行化

        每个隔离级别都针对事务并发问题中的一种或几种进行解决,事务级别越高,解决的 并发事务问题也就越多,同时也意味着加的锁就越多,所以性能也会越差。

事务的隔离级别解决的问题
1. READ_UNCOMMITTED

事务读取:不加锁

事务写入:加锁

解决问题:脏写

存在问题:脏读、不可重复读、幻读

2. READ_COMMITTED

事务读取:加锁(每次select完都会释放读锁)

事务写入:加锁

解决问题:脏写、脏读

存在问题:不可重复读、幻读

3. REPEATABLE_READ

事务读取:加锁(每次select完都不会释放读锁,而是事务结束后才释放,如果是InnoDB还会加间隙锁)

事务写入:加锁

解决问题:脏写、脏读、不可重复读

存在问题:幻读(InnoDB不存在)

4. SERIALIZABLE

不管是读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束

InnoDB的MVCC

        MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版 本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有了保 证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样 在做查询的时候就不用等待另一个事务释放锁。

        MVCC 的实现依赖于:隐藏字段、Undo Log、Read View。

        InnoDB就是通过MVCC机制解决可重复读中的幻读问题。

实现事务的步骤

语法

-- 1.关闭MySQL自动提交
SET AUTOCOMMIT = 0;
-- 2.开启一个事务,标记事务的起始点
START TRANSACTION;
-- 3.向数据库提交事务
COMMIT;
-- 3.将事务回滚,所有的数据库操作被取消
ROLLBACK;
-- 4.开启MySQL自动提交
SET AUTOCOMMIT = 1;

案例

bank表:

        当用户wyj借给lyf1000元时:

update bank set bmoney = bmoney-1000 where bname='wyj';
update bank set bmoney = bmoney+1000 where bname='lyf';

 

        当转账时不小心写错了lyf的名字:

update bank set bmoney = bmoney-1000 where bname='wyj';
update bank set bmoney = bmoney+1000 where bname='ly';

        我们发现wyj的钱借出去了,但是lyf并没有收到:

 

        这种情况是不允许出现的,所以我们可以使用一组事务:

-- 1. 关闭自动提交
set autocommit = 0;
-- 2. 开始事务
start transaction;
-- 3. 一组sql语句
update bank set bmoney = bmoney-1000 where bname='wyj';
update bank set bmoney = bmoney+1000 where bname='ly';
-- 4. 结束事务(判断)-- 提交(提交和回滚2选1,不可同时出现)commit;-- 回滚rollback;
-- 5. 开启自动提交
set autocommit = 1;

        当我们发现 wyj的钱借出去了,但是lyf并没有收到时,就可以选择回滚,让wyj的钱变会没借出时的金额,这样就符合我们日常的逻辑需求,如果“转账”成功,则提交。

函数

常用的日期函数

CURDATE()

返回当前的日期

CURTIME()

返回当前的时间

NOW()

返回当前的日期和时间

DATE_FORMAT(date,format)

依照指定的fmt格式格式化日期date值

SELECT DATE_FORMAT(NOW(),"%A-%B-%M")

结果: 

MONTH(date)

返回date的月份值(1~12)

DAY(date)

返回date的日

YEAR(date)

返回日期date的年份(1000~9999)

DATEDIFF(expr1,expr2)

查询两个日期的时间差(天数)

SELECT DATEDIFF(NOW(),"2024-6-25")

结果: 

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

查询距离时间的间隔时间,unit为单位(second、day、year...)

-- 一共活了多少秒(SECOND)
SELECT TIMESTAMPDIFF(SECOND,'2001-1-14',NOW())

结果:

-- 一共活了多少年
SELECT TIMESTAMPDIFF(YEAR,'2001-1-14',NOW())

结果:

根据时间间隔计算时间

写法一:

-- 五天后的时间
SELECT NOW() +INTERVAL 5 DAY
-- 五年后的时间
SELECT NOW() +INTERVAL 5 YEAR-- 五年前的时间
SELECT NOW() -INTERVAL 5 YEAR

写法二:

-- 五年后的时间
SELECT DATE_ADD(NOW(),INTERVAL 5 YEAR)
-- 五年前的时间
SELECT DATE_SUB(NOW(),INTERVAL 5 YEAR)

常用的字符串函数

拼接字符串

SELECT CONCAT('hello','world')

用指定符号分隔字符串

SELECT CONCAT_WS('$','hello','world') -- hello$world

向下取整

SELECT FLOOR(3.9)

 结果: 

向上取整

SELECT CEILING(3.9)

结果:

 

四舍五入

SELECT ROUND(3.4)
SELECT ROUND(3.5)

结果: 

-- 保留一位小数

SELECT ROUND(3.4,1)

结果:

 

截断小数

SELECT TRUNCATE(3.99999,2)

结果:

GROUP_CONCAT(expr)

返回由属于一组的列值连接组合而成的结果

SELECT Ssex,GROUP_CONCAT(sname) FROM student GROUP BY Ssex

结果:

慢查询

定义

        MySQL默认10秒内没有响应SQL结果,则为慢查询(可以去修改MySQL慢查询默认时间)

Mysql对慢查询的操作

//显示到mysql数据库的连接数
show status like 'connections';
--查看慢查询的状态
Show variables like '%slow_query%';
--设置慢查询的到表 mysql.slow_log
set global log_output='TABLE';
--设置慢查询的时间
set global long_query_time=3;
--开启慢查询
set global slow_query_log='ON';
--慢查询的次数
show status like 'slow_queries';
--慢查询记录
select * From mysql.slow_log ;
--慢查询sql语句
select convert(sql_text using utf8) sql_text from mysql.slow_log
--关闭慢查询
set global slow_query_log='OFF';

索引

定义

        索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

索引的优点

1、高效性:利用索引可以提高数据库的查询效率

2、唯一性:索引可以确保所查的数据的唯一性

3、完整性:用户可以加速表和表之间的连接,实现表与表之间的参照完整性

4、特殊能力性:通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统性能。

索引的缺点

1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。

2.因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

3. 如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快

索引的分类

主键索引

在数据库关系图中为表定义一个主键将自动创建主键索引。

唯一索引

不允许具有索引值相同的行,从而禁止重复的索引或键值。

常规索引

最基本的索引类型,没有唯一性之类的限制。

全文索引

        搜索引擎的关键技术,用于检索文本信息,可以是词语或者段落。

        我们想在上述表所有字段中找到和“西安”有关的信息,就可以使用全文索引,类似于模糊查询

create table wenzhang(wid int PRIMARY KEY auto_increment,title varchar(20),  content text, zuozhe varchar(20), -- 设置全文索引FULLTEXT(title,content,zuozhe) with parser ngram 
);insert into wenzhang(title,content,zuozhe) 
values
('西安往事','这是一个古老的城市,在这个城市中有很多的人,工厂,建筑物','小杨'),
('山西往事','这是一个古老的城市,这里有很多的人,工厂,建筑','老陶'),
('地球往事','这是一个古老的星球,这里有很多的人','老刘在西安'),
('银河往事','这是一个系,打算在这个系之外造一个西安','小彭');
-- 在所有字段中查找
select * from wenzhang 
where match(title,content,zuozhe) AGAINST('西安');

        此时,查询到了所有字段中含有“西安”的记录:

        那如果我们只想在title,zuozhe这两个字段中查找含有“西安”的记录呢?

select * from wenzhang where match(title,zuozhe) AGAINST('西安');

会报以下错误:
[SQL] select * from wenzhang where match(title,zuozhe) AGAINST('西安');
[Err] 1191 - Can't find FULLTEXT index matching the column list

        因为在创建表时我们设置了”FULLTEXT(title,content,zuozhe) with parser ngram“,所以必须在(title,content,zuozhe)中查找,不能随便缺少字段,所以:

ALTER table wenzhang add FULLTEXT(title,zuozhe)with parser ngram;
select * from wenzhang where match(title,zuozhe) AGAINST('西安');

结果:

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

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

相关文章

若依框架 : 生成代码

6.生成代码 6.1.配置生成设置 ruoyi-generator -> src -> main -> resources -> generator.yml 由于 案例中 表都有 前缀 为 tta_ , 这里设置去掉 6.2.生成代码 6.2.1.导入数据库中的表 6.2.2.修改设置 6.2.2.1.设置生成信息 点击 编辑 -> 生成信息 特别…

m4a怎么转mp3?m4a转mp3的几种方法教程

m4a怎么转mp3?M4A音频格式的全称MPEG-4 Audio,是一种音频压缩格式。这种格式以其卓越的音质和相对较小的文件大小而广受欢迎,尤其是在音乐存储、在线流媒体以及音频编辑等领域。M4A格式被广泛应用于苹果公司的产品中,如iPhone、iP…

开放式耳机会成为未来的主流吗?开放式耳机推荐指南

开放式耳机是否会成为未来的主流,是一个值得探讨的问题。 从目前的市场趋势和技术发展来看,有一些因素支持开放式耳机可能成为主流。 一方面,人们对于健康和舒适的关注度不断提高。长时间佩戴传统耳机可能导致耳部不适,而开放式…

在Linux中,部署及优化Tomcat

tomcat概述 自 2017 年 11月编程语言排行榜 Java 占比 13%,高居榜首,Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要学习如何部署 Tomcat 服务,根据生产环境实现多个虚拟主机的配置&#xf…

【QGroundControl二次开发】五.python生成自定义MAVLink消息及使用

一 . 环境配置 参考&#xff1a; MAVLink代码生成-C# 二. 生成MAVLINK协议 在MAVlink源码下找到message_definitions/common.xml&#xff0c;修改其中的内容。 例如&#xff1a; <message id"12" name"DISTANCE_SENSOR"><description>Dedi…

【Code Complete2】Note-1 [启发式编程、管理复杂度、隐藏设计]

【Code Complete2】_Note-1 [启发式编程、管理复杂度、隐藏设计] 文章目录 【Code Complete2】_Note-1 [启发式编程、管理复杂度、隐藏设计]启发式编程管理复杂度隐藏设计--减少“改动所影响的代码量” 启发式编程 ​ **设计是一个启发的过程&#xff0c;充满了不确定性&#…

记录|cmd方式恢复U盘中的数据

目录 前言一、CMD恢复Step1.Step2. 更新时间 前言 参考文章&#xff1a; u盘数据误删怎么恢复&#xff1f;安利8款数据恢复软件免费版&#xff08;2024 NEW&#xff09; 回家后&#xff0c;家人说U盘里的歌突然没有了。我就用电脑看了看&#xff0c;发现电脑中能看到U盘中是满的…

修改启动方案

AMP设置为1Linux&#xff08;CPU0&#xff09; 3HAL&#xff08;CPU1、 2、 3&#xff09; 配置。 用vscode打开its 配置文件rk3568_amp_linux.its文件修改 /* SPDX-License-Identifier: BSD-3-Clause */ /** Copyright (c) 2022 Rockchip Electronics Co., Ltd.*//dts-v1/; /…

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下&#xff0c;天气气温的变化已经对人们的生活各方面都产生了影响&#xff0c;人们在外出时大多都会在手机上看看天气如何&#xff0c;根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…

【大模型】基于LoRA微调Gemma大模型(1)

文章目录 一、LoRA工作原理1.1 基本原理1.2 实现步骤 二、LoRA 实现2.1 PEFT库&#xff1a;高效参数微调LoraConfig类&#xff1a;配置参数 2.2 TRL库SFTTrainer 类 三、代码实现3.1 核心代码3.2 完整代码 参考资料 大模型微调技术有很多&#xff0c;如P-Tuning、LoRA 等&#…

操作系统杂项(八)

目录 一、简述互斥锁的机制&#xff0c;互斥锁与读写的区别 1、互斥锁机制 2、互斥锁和读写锁 二、简述信号量及其作用 1、概念 2、原理 3、作用 三、简述进程、线程的中断切换过程 1、进程上下文切换 2、线程上下文切换 四、简述自旋锁和互斥锁的使用场景 1、互斥…

宝塔单ip,新建多站点

报错如上&#xff1a; 那么如何新建多站点呢 先随便写个名字上去&#xff0c;然后再重新绑定别的端口… 这个时候访问99端口即可 。 如果是有域名&#xff0c;则不需要这样做 、直接80端口也可以多站点

数据缺失补全方法综述

数据缺失补全方法综述 摘要1. 引言2. 数据缺失的类型3. 数据缺失补全方法3.1 简单插补方法3.1.1 均值插补3.1.2 中位数插补3.1.3 众数插补3.1.4 前向填充和后向填充3.1.5 线性插值3.1.6 多重插补 3.2 基于模型的插补方法3.2.1 线性回归插补3.2.2 加权回归插补3.2.3 主成分分析&…

STM32智能工业监控系统教程

目录 引言环境准备智能工业监控系统基础代码实现&#xff1a;实现智能工业监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能工业监控系统通…

Navicat premium最新【16/17 版本】安装下载教程,图文步骤详解(超简单,一步到位,免费下载领取)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Navicat是一款快速、可靠且功能全面的数据库管理工具&#xff0c;专为简化数据库的管理及降低系统管理成本而设计。以下是对Navicat的详细介绍&#xff1a; 一、产品概述 开发目的&#xff1a;Navicat旨在通过其直观和设计…

HTML前端面试题之<iframe>标签

面试题&#xff1a;iframe 标签的作用是什么?有哪些优缺点 ? 讲真&#xff0c;刷这道面试题之前我根本没有接触过iframe&#xff0c;网课没讲过&#xff0c;项目实战没用过&#xff0c;但却在面试题里出现了&#xff01;好吧&#xff0c;我只能说&#xff1a;前端路漫漫&…

构建基于Spring Boot的SaaS应用

引言 在设计和实现SaaS系统时&#xff0c;安全性是至关重要的考虑因素。一个全面的安全策略不仅能保护系统免受恶意攻击&#xff0c;还能确保用户数据的机密性、完整性和可用性。本文将探讨在SaaS架构中实现数据加密、敏感信息保护以及应用安全的最佳实践和技术方案&#xff0…

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时&#xff0c;你会删除一些文件夹或文件。如果你通过右键单击删除文件&#xff0c;则可以很容易从回收站恢复已删除的文件。但是&#xff0c;如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

C++ | Leetcode C++题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; class Solution { public:int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案…

element 结合 {} 实现自适应布局

通过el-row el-col 实现 例如 :xl“{ 1: 24, 2: 12, 3: 8, 4: 6 }[tableData.length] || 6” length 1 2 3 4 、代码数量为 1 2 3 4 >4 时不同卡片数量时尺寸的配置