【SQL】MySQL中的存储引擎、事务、锁、日志
存储引擎:
数据库管理系统(DBMS)使用数据存储引擎进行创建、查询、更新和删除数据。
MySQL5.5之前默认的存储引擎是MyISAM,5.5及之后版本默认的存储引擎是InnoDB。(my.ini中指定的)
- MyISAM:不支持事务,不支持外键
- InnoDB:支持事务,支持外键
- 存储引擎是针对表来说的,可以通过alter改变表的存储引擎
- InnoDB与MyISAM的最大区别是两点:InnoDB支持事务、支持行级锁
事务:
事务可以保证成批的SQL要么全部执行,要么全部不执行。
MySQL中只有InnoDB存储引擎才支持事务。
MySQL中默认是自动提交事务的,因此使用事务时要先禁止自动提交。
--禁止自动提交
set autocommit=0
--开启自动提交
set autocommit=1
--开启事务(可以使用begin或者start transaction)
begin
--执行多个SQL语句
update account set money = money-200 where id = 1
update account set money = money+200 where id = 2
--提交事务
commit--回滚事务
rollback
事务的特性ACID:
- 原子性(Atomicity): 事务是一个整体,要么全部成功,要么全部失败。
- 一致性(Consistency): 事务之前和事务之后的状态都是“正确”的(满足业务合理性)
- 隔离性(Isolation): 并发执行的两个事务之间相互隔离,互不影响(即使操作同一条数据也不应该互相影响)
- 持久性(Durability): 事务一旦被成功完成,数据被永久存储,不能回滚
事务的隔离级别:(越向下隔离级别越高)
- 脏读: A事务读取到B事务没有提交的数据
- 不可重复读: A事务提交之前,读取的同一个数据值发生变化(B事务提交导致)
- 幻读: A事务提交之前和提交之后,同一个数据值发生变化(A事务提交之前读到的数据值不会变化,提交之后才能读到B事务提交修改的数据)
事务隔离级别 | 解释 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交(read-uncommitted) | 一个事务可以读取另一个事务未提交的数据 | 是 | 是 | 是 |
读已提交(read-committed)(Oracle默认) | 一个事务要等另一个事务提交后才能读取数据 | 否 | 是 | 是 |
可重复读(repeatable-read)(MySQL默认) | 事务开启后,不再允许修改操作,但可以读取数据 | 否 | 否 | 是 |
串行化(serializable) | 各事务串行化顺序执行,互不影响,效率很低,一般不用 | 否 | 否 | 否 |
隔离级别的设置:
-- 查看隔离级别
show variables like '%isolation%';
-- 设置隔离级别
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
锁:
- 按数据操作粒度划分:
表锁:锁定整个表
行锁:锁定当前操作行 - 按数据操作类型划分:
读锁(共享锁):多个读操作可以同时进行互不影响,同一个表读锁可以加多个,加了读锁后只能读,自己和其他人均不能修改
写锁(排他锁):当前操作没完成前,其他人既不能写也不能读,同一个表写锁只能加一个
存储引擎 | 表级锁 | 行级锁 |
---|---|---|
MyISAM | 支持 | 不支持 |
InnoDB | 支持 | 支持 |
加表锁
MyISAM存储引擎使用表锁。
在查询语句(SELECT)前,自动给涉及的所有表加读锁。
在更新语句(UPDATE、DELETE、INSERT)前,自动给涉及的表加写锁。
一般不需要使用lock table命令给MyISAM表显式加锁。
-- 显式加表级读锁(共享锁)
lock table table_name read;
-- 显式加表级写锁(排他锁)
lock table table_name write;
-- 解锁
unlock tables;
加行锁
InnoDB默认使用行锁。
对于查询语句(SELECT)不会加任何锁。
对于更新语句(UPDATE、DELETE、INSERT),自动加排他锁,其他事务不能再修改该行数据,只有等当前事务commit后(释放排他锁),其他事务才能修改该行数据。
-- 显式加行级读锁(共享锁)
select * from table_name where ... lock in share mode;
-- 显式加行级写锁(排他锁)
select * from table_name where ... for update
日志:
- 错误日志: 记录MySQL发生错误的信息,默认开启
-- 查看错误日志存放目录
show variables like 'log_error%';
- 二进制日志: 记录了所有的DDL(Data Definition Language)语句和DML(Data Manipulation Language)语句,可以用于灾难时的数据恢复。MySQL8.0默认开启,低版本使用配置文件my.ini开启。
# 配置开启binlog日志,日志的文件前缀为mysqlbin
log_bin = mysqlbin
# 配置二进制日志的格式
binlog_format = STATEMENT
-- 查看是否开启binlog日志
show variables like 'log_bin';
-- 查看binlog日志格式
show variables like 'binlog_format';
二进制日志的格式 | 特点 |
---|---|
STATEMENT | 记录的都是SQL语句 |
ROW(MySQL8.0默认) | 记录每一行数据的变更 |
MIXED | 混合了STATEMENT和ROW |
- 查询日志: 记录了所有操作语句(相比二进制日志多了查询语句),默认不开启
# 配置开启查询日志,0关闭,1开启
general_log = 1
# 配置日志的文件名
general_log_file = file_name
-- 查看是否开启查询日志
show variables like 'general_log';
- 慢查询日志: 记录执行时间超过参数long_query_time(默认10s)且扫描记录数不小于min_examined_row_limit(默认0)的所有SQL语句
# 配置开启慢查询日志,0关闭,1开启
slow_query_log = 1
# 配置慢查询日志的文件名
slow_query_log_file = slow_query.log
# 设置long_query_time时间
long_query_time = 10
相关文章:
【SQL】MySQL中的存储引擎、事务、锁、日志
存储引擎: 数据库管理系统(DBMS)使用数据存储引擎进行创建、查询、更新和删除数据。 MySQL5.5之前默认的存储引擎是MyISAM,5.5及之后版本默认的存储引擎是InnoDB。(my.ini中指定的) MyISAM:不支持事务,不支…...
DRM全解析 —— CRTC详解(2)
接前一篇文章:DRM全解析 —— CRTC详解(1) 本文继续对DRM中CRTC的核心结构struct drm_crtc的成员进行释义。 3. drm_crtc结构释义 (5)struct drm_modeset_lock mutex /*** @mutex:** This provides a read lock for the overall CRTC state (mode, dpms* state, ...) an…...

3d环形图开发(vue3+vite+ts)
开发效果(待完善): 技术支持: Echarts echarts-gl 安装: 注:echarts与echarts-gl版本需对应,可参考官网 pnpm add echarts4.9.0 echarts-gl1.1.2 组件封装: <template><…...
element ui中父子组件共用一个el-dialog弹窗,切换组件页面弹窗进行关闭
在Element UI中,如果多个父子组件共用一个el-dialog弹窗,并且需要在切换组件页面时关闭弹窗,你可以考虑以下方法来实现: 使用Vuex进行状态管理: 在Vuex中创建一个状态来管理弹窗的显示状态(例如࿰…...
基于Keil a51汇编 —— Segments, Modules, and Programs
段、模块和程序 在初始设计阶段,定义程序要执行的任务,然后划分为子程序。以下是与 Ax51 汇编器和 Lx51 链接器/定位器一起使用的子程序类型的简要介绍。 段是代码块或数据存储器。段可以是可重定位的,也可以是绝对的。可重定位段具有名称、…...

基于Java+SpringBoot+Vue民宿管理系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

【Qt】三种方式实现抽奖小游戏
简介 本文章是基本Qt与C实现一个抽奖小游戏,用到的知识点在此前发布的几篇文章。 下面是跳转链接: 【Qt控件之QLabel】用法及技巧链接: https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm1001.2014.3001.5501 【Qt控件之QPus…...
【算法与数据结构】--算法基础--算法设计与分析
一、贪心算法 贪心算法是一种解决优化问题的算法设计方法,其核心思想是在每一步选择当前状态下的最优解,从而希望最终达到全局最优解。下面将介绍贪心算法的原理、实现步骤,并提供C#和Java的实现示例。 1.1 原理: 贪心算法的原…...
vue部分入门知识点代码示例
1. Vue实例 Vue.js的核心是Vue实例,用来管理你的应用。以下是一个创建Vue实例的示例: <!DOCTYPE html> <html> <head><title>Vue.js入门示例</title><!-- 引入Vue.js库 --><script src"https://cdn.jsdel…...
【图灵】Spring为什么要用三级缓存解决循环依赖问题
这里写自定义目录标题 一、什么是循环依赖二、什么是单例池?什么是一级缓存?三、什么是二级缓存,它的作用是什么?四、什么是三级缓存,它的作用是什么?五、为什么Spring一定要使用三级缓存来解决循环依赖六、…...

bert入门
bert是什么 BERT(Bidirectional Encoder Representations from Transformers)是一种自然语言处理(NLP)中的预训练模型,它是基于Transformer架构的一种深度学习模型。BERT的主要目标是在大规模文本语料库上进行预训练&a…...

蓝桥杯基础---切面条
切面条 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀…...

Spring Data Redis使用方式
1.导入Spring Data Redis的maven坐标 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. 配置Redis数据源 2.1application.yml文件…...

HarmonyOS/OpenHarmony原生应用开发-华为Serverless认证服务说明(二)
一、支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 文档中的TS作者认为就是ArkTS之意。暂时支持四种模式,手机、邮箱、匿名、自有账户。 二、暂时不支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 包括华为账户注册登录,HarmonyOS…...

华为数通方向HCIP-DataCom H12-831题库(多选题:241-259)
第241题 设备产生的信息可以向多个方向输出信息,为了便于各个方向信息的输出控制,信息中心定义了10条信息通道,使通道之间独立输出,缺省情况下,以下哪些通道对应的输出方向可以接收Trap信息? A、console通道 B、logbuffer通道 C、snmpagent通道 D、trapbuffer通道 答案:…...
深度学习在 NumPy、TensorFlow 和 PyTorch 中实现所有损失函数
目录 一、说明 二、内容提示 三、均方误差 (MSE) 损失 3.1 NumPy 中的实现 3.2 在 TensorFlow 中的实现 3.3 在 PyTorch 中的实现 四、二元交叉熵损失 4.1 NumPy 中的实现 4.2 在 TensorFlow 中的实现 4.3 在 PyTorch 中的实现 五、加权二元交叉熵损失 5.1 分类交叉熵损失 5.2 …...

超低延时直播技术演进之路-进化篇
一、概述 网络基础设施升级、音视频传输技术迭代、WebRTC 开源等因素,驱动音视频服务时延逐渐降低,使超低延时直播技术成为炙手可热的研究方向。实时音视频业务在消费互联网领域蓬勃发展,并逐渐向产业互联网领域加速渗透。经历了行业第一轮的…...

相机坐标系之间的转换
一、坐标系之间的转换 一个有4个坐标系:图像坐标系、像素坐标系、相机坐标系、世界坐标系。 1.图像坐标系和像素坐标系之间的转换 图像坐标系和像素坐标系在同一个平面,利用平面坐标系之间的转换关系可以之知道两个坐标系变换的公式,并且该…...

jvm--对象实例化及直接内存
文章目录 1. 创建对象2. 对象内存布局3. 对象的访问定位4. 直接内存(Direct Memory) 1. 创建对象 创建对象的方式: new最常见的方式、Xxx 的静态方法(单例模式),XxxBuilder/XxxFactory 的静态方法Class 的…...

【数据结构与算法】如何对快速排序进行细节优化以及实现非递归版本的快速排序?
君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,国庆长假结束了,无论是工作还是学习都该回到正轨上来了,从今天开始恢复正常的更新频率,今天为大家带来的内容…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...