mysql事务及存储引擎

news2024/12/26 22:46:55

目录

什么是事务

事务的ACIP特性

事务之间的影响

mysql隔离级别

事务隔离级别的作用范围

事务控制语句

mysql存储引擎


 

什么是事务

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

事务是通过事务的整体性以保证数据的一致性。

说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位,事务的存在可以确保数据操作的正确性和可靠性,保证数据在操作过程中,不会出现异常或错误 。


事务的ACIP特性

ACID,是指在可靠数据库管理系统中,事务应该具有的四个特性:原子性(Atomicity),一致性(Consistency),隔离性(lsolation),持久性(Durability),这是可靠数据库所应具备的特性

原子性:指事务是一个不可再分割的工作单位,事务中的操作要么发生,要么不发生。

事务是一个完整的操作,事务的各元素是不可分的,事务的所有元素必须作为一个整体提交或回滚,如果有一个环节出现问题,那么整个事务将失败

一致性:   事务执行前后,数据库从一个一致状态转换到另一个状态,保证数据的完整性和准确性。

当事务完成时,数据必须处于一致状态。在事务开始前,数据库中存储的数据处于一致状态。
在正在进行的事务中,数据可能处于不一致的状态。当事务成功完成时,数据必须再次回到已知的一致状态

隔离性:   多个并发事务相互隔离,互不干扰,每个事务独立执行,避免数据混乱和不一致

 

持久性:   一旦事务提交,其对数据库的修改是永久性的,即使系统发生故障或重启,修改的数据也不会消失。


事务之间的影响

脏读: 

当有两个事务在访问同一个数据时,一方对数据进行了修改,但最后选择了回滚(没有写入到数据库中),但另一方事务在他回滚前读到了这个被修改的数据,这就是脏数据。也就是脏读。

不可重复读:

一个事务两次相同的查询,返回的不同的数据,这是由于其他事务修改并提交所造成的。

幻读:

一个事务1在对表内容进行修改,而且是涉及到全表的,另一个事务2此时也对此表内容进行修改,并且在事务1之前提交了。此时,事务1修改完后,发现刚刚的更改对某些数据没起作用,这是事务2刚刚插进来的数据,让操作事务1的用户感觉很魔幻,出现了幻觉,也就是幻读。

丢失更新

两个事务同时读取同一条记录  事务1先修改记录,事务2也修改记录(2不知道1修改过),2提交数据后会覆盖掉1的修改记录。但这不是意味着事务1的操作失败了,事务1成功了,只是记录被事务2的记录覆盖掉了


mysql隔离级别

read uncommitted (安全性最差,但性能好 不使用)

read uncommitted:(读取尚未提交的数据)不解决脏读,允许脏读,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据

read committed  Oracle 数据库默认  安全性较差,性能较好) 

read committed:(提交读)读取已经提交的数据,可以解决脏读,只能读取已经提交的数据

repeatable read  mysql数据库默认  安全性较高,性能较差)

repeatable read:(可重复读)重复读取,可以解决脏读和不可重复读。无论其他事务是否修改并提交了数据,在这个事务内看到的数据始终不受其他事务影响

serializable  (安全性最高,性能最差  不使用)

serializable:(串行化)可以解决脏读,不可重复读,幻读。相当于锁表,完全串行化的读,每次读都需要获得表级共享锁,读写相互阻塞


事务隔离级别的作用范围

会话级:对当前的会话有效

全局级:对所有的会话有效

查询全局事务隔离级别

9f9f7e89ce2649b0bc2a9751965d032f.png

查询会话事务隔离级别

b968d868ec8a42499b3ebf62cf7652a8.png

设置全局事务隔离级别

1c4f54fa5c214b1f8467f3bc61894d87.png

设置会话事务隔离级别

cd198d38126f4f20a387f24d09f328c1.png


事务控制语句

begin 或 start transaction:显式地开启一个事务

commit 或 commit work:提交事务,并使已对数据库进行的所有修改变为永久性的

rollback 或 rollback work:回滚事务,撤销当前所有未提交的所有操作并结束事务

savepoint 回滚点名 :使用savepoint 允许在事务创建一个回滚点,一个事务可以创建多个回滚点

(回滚点只会存在当前事务中,事务结束,回滚点消失)

rollback to [savepoint] 回滚点名:把事务回滚到标记点

set autocommit = 0;           禁止自动提交

set autocommit=1;              开启自动提交,mysql默认1

show variables like  'autocommit'      查看mysql中的autocommit值

事务提交

9d1cb780e8eb43e5885e574d8ee9e2db.png

706f24fbf6be4731af105b0a31b5accb.png

a543e4548bbf40b5b452c2794c8d5223.png

0686a8ad538143b487a27cdbc2d50ef7.png

c5e169ff80ff48c796a6f3fc24c6f918.png

8578b75efb9f4e978f9ddf0aab06719c.png

 

事务回滚

dc96359aa97045f39e3477dd6b939cc0.png

ed0eada553204512a12f1cd57a549131.png

设置回滚点

a2daa43980644d74908acdd954307716.png

ab88bcbf0bf74e0792f6c8e989667eed.png

64d7fc9235c44a5c8bbc04bc475587d8.png

87ef7b770b1b4194b8bcdca94d7aad02.png

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit , 当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

如果开启了自动提交,mysql会把每个sql语句当作一个事务,然后自动的commit,当然无论开启与否,begin, commit|rollback 都是独立的事务。


mysql存储引擎

存储引擎介绍

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

mysql的常用存储引擎

Myisam

myisam不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

myisam适合查询,插入为主的应用场景

 

myisam在磁盘上存储成三个文件,文件名和表名相同,但是扩展名分别为:

.frm    文件存储表结构的定义

.MYD(MYData)  数据文件的扩展名

.MYI(MYIndex)  索引文件的扩展名

表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞: 串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
会在数据写入的过程阻塞用户数据的读取,也会在数据读取的过程中阻塞用户的数据写入
特性:数据单独写入或读取,速度过程较快且占用资源相对少

MyISAM 表支持 3 种不同的存储格式:

静态表(固定长度):静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。固定长度10,存储非常迅速,容器缓存,故障之后容易恢复

动态表 :动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难

压缩表 :压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

myisam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景


lnnoDB

lnnodb 支持事务,读写阻塞与事务的隔离级别有关,能高效的缓存索引和数据,表与主键以簇的方式存储,支持分区,表空间,支持外键约束,5.5版本后支持全文索引,对硬件资源要求还是比较高的场合,采用行级锁定,但在全表扫描时仍然是表级锁定

InnoDB 中不保存表的行数,如 select count(*) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表
对于自增长的字段,InnoDB 中必须包含只有该字段的索引

但是在 MyISAM 表中可以和其他字段一起建立组合索引,清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表(truncate)
 

mysql从5.5.5版本开始,默认的存储引擎为lnnodb

查看系统支持的存储引擎

show engines;

09c90ebbdd22427da7ddc397be5e34b0.png

查看表使用的存储引擎

show table status from 库名 where name='表名'\G;(命令太长,不推荐使用)

show create table 表名;

af56cde726b34f6192fe8f0d0dda5eb4.png

修改存储引擎

alter table 表名 engine=引擎名;

bf34c7e1a6fb401da59facf9c8748562.png

50357c9d126b474b9021beffba955464.png

创建表时指定引擎

a80eb53e16634a97ae5cf6184e99ff99.png

 

修改配置文件,但需要重启mysql,对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

vim /etc/my.cnf

修改此模块下的内容

[mysqld]

default-storage-engine=INNODB

systemctl restart mysqld

 

a7e90658555a4720a0953b04382933de.png

ada56910d9a64e46a31eb6482bcbedde.png

2a6d53930d6e4d72a50a30b8ce7ae184.png

80715729cf8b42d8b2b9e55f91bba97e.png

5ad71862af3949c5b8e448a161134074.png

 

 

 

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

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

相关文章

STM32—控制蜂鸣器(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c tim_irq.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 定时器中断是利用定时器的计数功能(向上计数或向下计…

Web前端—CSS属性计算过程

属性计算过程 CSS 属性计算过程1. 确定声明值2. 层叠冲突比较源的重要性比较优先级比较次序 3. 使用继承4. 使用默认值 CSS 属性计算过程 我们所书写的任何一个 HTML 元素,实际上都有完整的一整套 CSS 样式(该元素上面会有 CSS 所有的属性。&#xff0…

Windows 7 一键恢复 - 联想拯救系统

Windows 7 一键恢复 - 联想拯救系统 1. 联想拯救系统1.1. OEM 分区1.2. 一键恢复 References 1. 联想拯救系统 1.1. OEM 分区 计算机 -> 管理 -> 存储 -> 磁盘管理 1.2. 一键恢复 重新启动电脑 F11 -> 从初始备份恢复 References [1] Yongqiang Cheng, https…

实在数字员工,助力菜鸟智慧物流高效腾飞,领航行业新高度

秉承人人都有一个智能助理的发展愿景,自2023年首个数字员工落地以来,菜鸟数字员工累计运行时长已达10万小时。 在智能物流科技不断飞速迭代的今天,物流行业作为社会经济运行的重要支柱和电子商务生态链的关键环节,面临着前所未…

Python灰帽子网络安全实践

教程介绍 旨在降低网络防范黑客的入门门槛,适合所有中小企业和传统企业。罗列常见的攻击手段和防范方法,让网站管理人员都具备基本的保护能力。Python 编程的简单实现,让网络运维变得更简单。各种黑客工具的理论和原理解剖,让人知…

PLC常用通信协议应用

PLC通信协议 ModbusModbus协议介绍Modbus协议的应用Modbus通信模式 Modbus RTU通讯Modbus RTU报文映射寄存器常见功能码数据类型Modbus CRC校验计算Modbus RTU举例(读位)Modbus RTU举例(读字) Modbus TCP协议应用TCP数据帧Modbus …

Spring IOC 容器的加载过程(bean 的创建过程)

Spring IOC 容器的加载过程(bean 的创建过程) 配置Bean 通过xml或者是Component Bean 等进行配置 解析Bean,得到BeanDefinition定义对象 通过 BeanDefintionReader 将 bean 进行解析,准备要创建的bean对象的定义对象BeanDefinition,存放到Be…

Elasticsearch 索引模板、生命周期策略、节点角色

简介 索引模板可以帮助简化创建和二次配置索引的过程,让我们更高效地管理索引的配置和映射。 索引生命周期策略是一项有意义的功能。它通常用于管理索引和分片的热(hot)、温(warm)和冷(cold)数…

尽可能使用清晰、统一的方式初始化所有对象:列表初始化。【C++】

不管是为了统一性,还是避免发生窄化转换,尽可能使用初始化列表。 说明哪些对象可以使用列表初始化?代码演示 说明 C11 引入了列表初始化(也称为统一初始化或初始化列表),它是一种使用花括号 {} 来初始化对…

对象实例化在bean注入之前导致@Autowired失效

开发时遇到一个问题,Springboot的Autowired失效,无法注入bean,获取的到的mqttProperties一直为空。 MqttProperties定义: 业务代码: 按理来说,我的MqttProperties和当前类 NettyMqttClient都注册为了bea…

铁道障碍物检测6种YOLOV8

铁道障碍物检测6种,采用YOLOV8训练,得到PT模型,然后转换成ONNX模型,OPENCV调用 铁道障碍物检测6种YOLOV8

YOLOv8 | 注意力机制 | 添加ECA注意力机制

目录 原理简介 代码实现 yaml文件实现 检查是否添加执行成功

教大家几种解决msvcr120.dll文件丢失的问题以及解决办法

当这个msvcr120.dll文件丢失或损坏时,依赖它的程序可能无法启动或正常运行,这可能影响电脑的使用效率。如果用户遇到因缺少msvcr120.dll而导致的程序错误,安装或修复这个msvcr120.dll文件是一种维护措施,可以帮助恢复软件的正常功…

【python从入门到精通】--第一战:安装python

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

餐饮连锁食品安全标准落实难?悠络客AI巡检,用SOP AI化守护“舌尖上的安全”

食品安全与卫生问题一直是全民关注的焦点,从民生角度,民以食为天,食品安全关系到消费者的身体健康和生命安全;从企业角度,品牌建设不易,一旦出现食品卫生安全问题,不仅会带来直接经济损失&#…

Web实战:采用JSP+ Servlet + DB实现用户登录功能

文章目录 一、项目运行效果二、项目实现步骤三、项目实战总结 一、项目运行效果 二、项目实现步骤 三、项目实战总结 本实战项目采用了JSP Servlet DB的组合,搭建了一个简单的用户登录功能。通过创建数据库、用户表、Jakarta EE项目,以及编写用户实体类…

慧天【HTWATER】软件是什么?在城市内涝水文水动力耦合模拟中如何应用小李15833332534

慧天[HTWATER]软件简介 针对城市排水系统基础设施数据管理的需求,以及水文、水力及水质模拟对数据的需求,实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模拟计算。可以对城市低影响开发…

Linux命令学习入门

文章目录 登录注销关机重启Vim编辑器快捷键文件目录类打包、解包、压缩和解压指令输出重定向>和追加>>指令时间日期类搜索查找类用户管理文件所有者所在组权限管理变更权限crond任务时间调度crond相关指令:特殊符号说明: at定时任务磁盘分区磁盘…

力扣HOT100 - 1. 两数之和

解题思路&#xff1a; 解法一&#xff1a;暴力 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i)for (int j i 1; j < n; j) {if (target nums[i] nums[j])return new int[] { i, j };}return new int[…

复盘一下我用过的设计模式

建造者模式 保卫萝卜中使用了建造者模式。UML图如下&#xff1a; 接口&#xff1a; public interface IBuilder<T> {//获取到游戏物体身上的脚本对象&#xff0c;从而去赋值T GetProductorClass(GameObject gameObject);//使用工厂去获取具体的游戏对象GameObject GetP…