MySQL的事务深入理解和存储系统

目录

一、事务的基本理论

1.事务的隔离

1.1事务之间的相互影响

1.2事物隔离级别

2.查询和设置事物隔离级别

2.1查询全局事务隔离级别

2.2查询会话事物隔离级别

2.3设置全局事务隔离级别

2.4设置会话事务隔离级别

​编辑3.事务控制语句

​编辑3.1提交事务

​编辑3.2回滚事务

3.3多点回滚

3.4设置控制事务

二、MySQL存储引擎

1.存储引擎的种类

2.InnoDB存储引擎

3.MylSAM存储引擎

1.特点

2.文件存储格式

4.修改存储引擎

4.1修改已存在的表

4.2建表时指定引擎

4.3修改配置文件


一、事务的基本理论

1.事务的隔离

在数据库中,多个事务同时执行时,它们之间可能存在相互影响。事务的隔离性通过事务隔离级别来控制,不同的隔离级别对事务间的影响有不同的管理策略。

1.1事务之间的相互影响

脏读(Dirty Read): 在较低的隔离级别(如读未提交Read Uncommitted)下,一个事务可以读取到另一个事务尚未提交的数据,如果这个事务随后被回滚,那么读取的数据就是无效的。

不可重复读(Non-repeatable Read): 即在一个事务中,对同一行数据进行两次读取时,结果不一致,因为在这两次读取之间,另一个事务可能对此行数据进行了修改并提交了事务。

幻读(Phantom Read): 在可重复读(Repeatable Read)隔离级别下,同一个事务在执行相同的查询时,两次查询结果集中包含了不同的行(新增的行像幽灵一样突然出现),这是因为另一个事务在这两次查询期间插入了新的行并提交了事务。

丢失更新(Lost Update): 当两个事务同时修改同一行数据且都未进行锁操作时,可能会导致其中一个事务的更新丢失。例如,两个事务先后将某行的值从A更新为B和C,最终的结果可能是A直接变为C,B的更新被忽略。

不可重复读:指的是在同一个事务内,同一个查询在不同时刻读取到了不同的数据。比如事务A在开始时读取了一行数据,但是在事务A还未结束时,事务B修改了这行数据并提交了事务。当事务A再次读取同一行数据时,发现数据内容与之前读取的结果不同,这就发生了不可重复读。

幻读:则是在同一个事务内,同一个查询在不同时刻读取到了不同的行数。同样是事务A在开始时执行了一个范围查询(如:查询年龄大于20岁的人数),并在结果集基础上进行了操作。之后事务B插入了一些新的满足条件(年龄大于20岁)的数据并提交了事务。当事务A再次执行同样的范围查询时,发现结果集中出现了新的行(即“幽灵行”),尽管它先前读取过的数据行并未发生变化,但行数增加了,这就是幻读现象。

1.2事物隔离级别

为了解决这些问题,数据库系统提供了不同的事务隔离级别:

读未提交(Read Uncommitted):最低隔离级别,允许脏读、不可重复读和幻读。

读已提交(Read Committed):解决了脏读问题,但仍可能出现不可重复读和幻读。

可重复读(Repeatable Read):MySQL默认的隔离级别,解决了脏读和不可重复读问题,但幻读仍有可能发生(在MySQL中通过Next-Key Locks解决一部分幻读问题)。

串行化(Serializable):最高隔离级别,可以避免所有并发问题,但可能会导致性能下降,因为它几乎等同于事务串行执行。在串行化级别下,事务冲突会被严格禁止,以确保事务间不会互相影响。

事务隔离级别的作用范围分为两种

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

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

2.查询和设置事物隔离级别

2.1查询全局事务隔离级别

show global variables like '%isolation%';

mysql> show global variables like '%isolation%';

select @@global.tx_isolation;

mysql> select @@global.tx_isolation;

transaction_isolation 和 tx_isolation 展示的是当前服务器的全局事务隔离级别

2.2查询会话事物隔离级别

show session variables like '%isolation%';

mysql> show session variables like '%isolation%';

select @@session.tx_isolation; 

mysql> select @@session.tx_isolation; 

在进行会话事务,即交互时的隔离级别同样为repeatable read,即可重复读

2.3设置全局事务隔离级别

set global transaction isolation level 事务隔离级别;

设置全局默认事务隔离级别为read committed

set global transaction isolation level read committed;

2.4设置会话事务隔离级别

set session transaction isolation level 事务隔离级别;

设置会话事务为read committed

set session transaction isolation level read committed;

3.事务控制语句

首先准备工作创建名为kgc_school的数据库,并在kgc_school下创建名为ky35的数据表

插入数据


3.1提交事务

使用begin开始事务,而后开始处理、修改数据,最后使用commit提交事务,算一次完整的事务,则在事务中的所有操作生效,否则不生效。

首先begin开始事务

给'xuzhou'的money减少100

最后commit提交事务

3.2回滚事务

使用rollback指令回滚未提交的事务,使数据回到事务开始前的状态

可知'xuzhou'的money是900

开启事务并修改

使用rollback进行回滚

3.3多点回滚

开始事务后,使用savepoint s1 进行节点标记,而后使用 rollback to savepoint 节点名称进行回滚

第一次修改的值为800,并设置事务节点为s1

再次修改,此时'xuzhou'的money数值为700,并设置事务节点为s2

进行回滚并回到s1

此操作不可逆,如果回滚到s1之后,不能回到之后的节点,只能往前

3.4设置控制事务

使用set指令设置控制事务

修改控制事务autocommit的值为off

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

 如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。

二、MySQL存储引擎

在MySQL数据库的世界里,存储引擎作为数据库的核心组件,负责数据的存储、检索和索引管理等关键任务。MySQL支持多种存储引擎,每种引擎都有其独特的优劣和适用场景,使得MySQL能够灵活适应各种各样的业务需求。


1.存储引擎的种类

使用show engines;指令查当前mysql支持哪些存储引擎

字段含义

Engine存储引擎
Support系统是否支持
Comment注释信息
Transactions是否支持事务
XA是否支持XA协议
Savepoints

是否支持节点

2.InnoDB存储引擎

InnoDB是MySQL的默认存储引擎。InnoDB引擎支持行级锁定,能够有效减少并发操作时的锁争用,提高并发性能。同时,它实现了ACID(原子性、一致性、隔离性、持久性)事务特性,确保了数据的一致性和安全性。此外,InnoDB引擎支持外键约束,提供了良好的数据完整性保障。在现代MySQL版本中,InnoDB还支持分区表、聚集索引和自适应哈希索引等特性,进一步优化了性能。

MRG_MyISAM存储引擎

基于MERGE,将多个MyISAM表合并成一个逻辑表。相同MyISAM表的集合

MEMORY存储引擎

MEMORY(以前称为 HEAP)存储引擎将数据存储在内存中,因此它的查询速度极快,尤其适用于临时表或者需要快速读写的场景。但由于数据仅存在于内存中,一旦MySQL服务器关闭,表中的数据就会丢失。此外,MEMORY引擎也不支持事务和外键约束。

BLACKHOLE黑洞引擎

所有写入都被丢弃,用于记录binlog但不实际存储数据

MyISAM存储引擎

MyISAM曾是MySQL早期的默认存储引擎,虽然在事务处理和行级锁定方面不如InnoDB强大,但因其索引文件和数据文件分离、全表扫描速度快等特点,在读密集型场景中表现出色。MyISAM不支持事务和外键,基于哈希,存储在内存中,对临时表很有用

ARCHIVE存储引擎

ARCHIVE存储引擎主要用于大量历史数据归档,它压缩率极高,适合长期存储且很少需要更新的大容量静态数据。ARCHIVE引擎只支持INSERT和SELECT操作,不支持UPDATE和DELETE,也不支持索引。

CSV存储引擎

以CSV格式存储数据,易于与其他程序交换数据

目前MySQL常用的存储引擎有InnoDB存储引擎与MyISAM存储引擎

2.lnnoDB存储引擎

MySQL从5.5之后版本开始,默认的存储引擎为 InnoDB

在建表时,不需要指定,默认就是此类

DML操作遵循ACID模型,支持事务;

行级锁,如果事务A正在操作某行,其它事务不能操作此行,可以操作此表的其他行,提高并发访问性能;

支持外键 FOREIGN KEY约束,保证数据的完整性和正确性

3.MylSAM存储引擎

1.特点

不支持事务,不支持外键

支持表锁,操作或者修改一张表的数据时,整张表会被锁起来,不允许其他用户操作,等到操作结束退出后释放,不支持行锁

访问速度快,对事物的完整性没有要求

2.文件存储格式

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

静态表(Fixed-length Table)

在MySQL的MyISAM存储引擎中,静态表也称为固定长度表。这类表中的每一行数据占用的空间是固定的,即所有列的长度总和。例如,如果一个列定义为CHAR(10),无论实际存储的内容长短,都将占用10个字符的固定空间。静态表的优点在于查询速度快,因为行数据是连续存储且大小恒定,易于缓存和快速定位。缺点是如果数据长度小于定义长度时,会浪费存储空间。

动态表(Variable-length Table)

动态表(也称变长表)中的行长度是可以变化的。例如,在VARCHAR类型的列中,实际存储的数据长度与列定义的最大长度有关。动态表能够更有效地利用存储空间,尤其是对于包含大量可变长度数据的列时。但这也可能导致数据在硬盘上的存储位置不连续,影响到某些查询操作的性能。
压缩表(Compressed Table):

压缩表

是对已有表的数据进行压缩存储,以节省磁盘空间。在MySQL中,可以使用MyISAM的myisampack工具对MyISAM表进行压缩,创建出来的表为只读表。InnoDB存储引擎也支持表压缩,通过设置相应的表选项可以在表级别进行压缩,这样既能节省存储空间,又能保持表的读写能力。压缩表在读取时需要解压,这会增加CPU的消耗,但在I/O密集型环境中,由于减少了磁盘读写,总体上可能提高性能。

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

文件存储表结构的定义的扩展名:.frm

数据文件的扩展名为 .MYD

索引文件的扩展名是 .MYI

4.修改存储引擎

4.1修改已存在的表

查看已存在的表

alter table 表名 engine = 存储引擎种类;

mysql> alter table ky35 engine =myisam;

查看

4.2建表时指定引擎

create table 表名 (字段1 字段1类型[comment 注释信息],字段2 字段2类型) engine = 存储引擎种类

mysql> create table myi(id int(4),name varchar(10),age char(3))engine=myisam;

查看

4.3修改配置文件

在/etc/my.cnf文件加添加指定信息,来确定建表时的默认存储引擎类型

修改后重新启动文件

创建文件

查看

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值