欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > mysql事务与存储引擎

mysql事务与存储引擎

2024/10/24 6:34:19 来源:https://blog.csdn.net/Vince15dvd/article/details/139783830  浏览:    关键词:mysql事务与存储引擎

事务:

定义:事务就是一组数据库操作序列(包含一个或多个SQL操作命令),事务会把所有操作看作是一个不可分割的整体向数据库系统提交或撤销操作,所有操作要么都执行,要么都不执行。

事务的 ACID 特性:原子性、一致性、隔离性、持久性

A 原子性:事务管理的基础,把事务中的所有操作看成是一个不可分割单元,要么都执行要么都不执行。

C一致性:事务管理的目的,保证事务开始前和结束数据保持一致。

I 隔离性:事务管理的手段,多个事务并发操作同一个表时,每个事务都有各自独立的数据空间,事务的执行不会收到其他事务的干扰,可通过设置隔离级别来解决不同的一致性问题。

D 持久性:事务管理的结果。当事务被提交以后,事务中的命令操作会被永久保存,且不会被回滚。

事务的隔离级别:

未提交读Read Uncommitted 允许 脏读 不可重复读 幻读
提交读 Read Committed  不允许 脏读,允许 不可重复读 幻读     (一般生产环境使用的隔离级别)
可重复读Repeatable Read 不允许 脏读 不可重复读,有条件的允许 幻读(InnoDB存储引擎可以通过多版本并发控制MVCC解决幻读问题)
串行读Serializable 都不允许,相当于表级锁定,但是会影响数据库的读写效率性能

脏读(读取未提交数据)

A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。

不可重复读(前后多次读取,数据内容不一致)

事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。

幻读(前后多次读取,数据总量不一致)

事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。

设置隔离级别

set global transaction isolation level 隔离级别名称;      #全局级隔离级别,可在所有会话有效,当前会话需要重新登录方可有效
set session transaction isolation level 隔离级别名称;     #会话级隔离级别,仅在当前会话中立即有效

查看隔离级别

show global variables like '%isolation%';
show session variables like '%isolation%';

事务管理操作:

begin; #显式的开启一个事务
.... insert into   update 表 set    delete from  #事务性操作
savepoint XX #在事务中创建回滚点
rollback to XX; #在事务中回滚到指定的回滚点位置
commit; 或 rollback;  #提交或回滚 结束事务

自动提交事务

set global/session autocommit = 0/1       #global全局级别,session会话级别,0关闭自动提交,1开启自动提交show global/session variables like 'autocommit'; #查看Mysql中的AUTOCOMMIT值

存储引擎

定义:存储引擎是MySQL数据库的组件,负责执行实际的数据IO操作(数据的存储和提取)。工作在文件系统之上,数据库的数据会先传输到存储引擎,再按照存储引擎的存储格式保存到文件系统。

常用的存储引擎:InnoDB   MyISAM

MyISAM 和 InnoDB 的区别?

  • MyISAM:不支持事务、外键约束;支持全文索引;锁定类型只支持表级锁定;适合单独的查询和插入的操作;读写会相互阻塞;硬件资源占用较小;数据文件和索引文件是分开存储的,存储成三个文件:表结构文件.frm、数据文件.MYD、索引文件.MYI
  • 使用场景:适用于不需要事务支持,单独的查询或插入数据的业务场景
  • InnoDB:支持事务、外键约束;也支持全文索引;锁定类型通过索引支持行级锁定(在全表扫描时仍会表级锁定);读写并发能力较好;缓存能力较好可以减少磁盘IO的压力;数据文件也是索引文件,存储成:表结构文件.frm、表空间文件.ibd
  • 使用场景:适用于需要事务支持,数据一致性要求较高,数据会频繁更新,读写并发高的业务场景

MySQL 查询数据的执行过程:

1.客户端向 MySQL 服务器发送一条查询请求,连接器负责处理连接,并进行身份验证和权限控制。
2.MySQL 先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果;否则使用查询解析器进行SQL语句解析、预处理,再由优化器生成对应的执行计划。
3.MySQL 根据执行计划,调用存储引擎来执行查询。
4.将结果返回给客户端,同时缓存查询结果。

存储引擎管理操作:

alter table 表名 engine= innodb /myisam;   #针对已存在的表修改存储引擎create table 表名 (。。。) engine=innodb/myisam;   #新建表时指定存储引擎	set global/session default_storage_engine=innodb/myisam;   #设置默认存储引擎通过配置文件设置
vim /etc/my.cnf
default_storage_engine=INnoDB/MyISAM查看存储引擎
show create table 表名;
show table status [from 库名] where name = '表名';

死锁:

定义:死锁是指两个或多个事务在同一个资源上相互占用,并请求对方锁定的资源,从而导致相互阻塞的现象。

如何避免死锁?

  1. 设置事务的锁等待超时时间 innodb_lock_wait_timeout
  2. 设置开启死锁检测功能 innodb_deadlock_detect
  3. 为表建立合理的索引,减少表锁发生的概率
  4. 如果业务允许,可以降低隔离级别,比如选用 提交读 Read Committed 隔离级别,从而避免间隙锁导致死锁
  5. 建议开发人员尽量使用更合理的业务逻辑,比如多表操作时以固定顺序访问表,尽量避免同时锁定多个资源
  6. 建议开发人员尽量保持事务简短,减少对资源的占用时间和占用范围
  7. 建议开发人员在读多血少的场景下采用乐观锁机制

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com