MySQl事务与存储引擎

Posted 还行少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQl事务与存储引擎相关的知识,希望对你有一定的参考价值。

一、mysql事务

1.概念

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务

2.特点

  • 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化

  • 持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3.数据不一致产生的后果

  • 脏读:
    一个事务读取另一个事务为提交的数据,而这个数据时由可能回滚的

  • 不可重复读:
    一个事务内两个相同的查询却返回了不同数据,这是由于查询时系统中其他事务修改的提交而引起的

  • 幻读:
    一个事务对表中的数据进行了整改,这种修改涉及到表中的全部数据。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据,操作前一个事务的用户会发现表中还有没有修改的数据行,就好像发生幻觉一样

  • 丢失更新:
    两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果

4.事务隔离级别

  • read uncommitted:
    读取尚未提交的数据(不解决脏读)
  • read committed:
    读取已提交的数据(可以解决脏读)
  • repeatable read:
    重读读取(可以解决脏读 和 不可重复读)
  • serializable:
    串行化(可以解决脏读、不可重复读和虚读),相当于锁表

5.事物控制语句

  • BEGIN 或 START TRANSACTION
    显式地开启一个事务;

在这里插入图片描述

  • COMMIT 或 COMMIT WORK
    COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
    在这里插入图片描述

  • ROLLBACK 或ROLLBACK WORK
    回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
    在这里插入图片描述

  • SAVEPOINT identifier,
    SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • ROLLBACK TO identifier 把事务回滚到标记点;

在这里插入图片描述

  • 查看全局事务处理级别
    在这里插入图片描述

  • 设置全局事务隔离级别
    在这里插入图片描述

  • 查询会话事务隔离级别
    在这里插入图片描述

  • 设置会话事务隔离级别
    在这里插入图片描述

二、存储引擎

1.概念

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

2.常用存储引擎

2.1 MyISAM

2.1.1 特点

  • 不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
  • 访问速度快,对事务完整性没有要求
  • 适合查询、插入为主的应用

2.1.2 支持三种不同存储格式

  • 静态表(固定长度):
    静态表的默认的存储格式,静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的有点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态多
  • 动态表:
    动态表包含可变字段,记录不是固定长度,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 或 MYISAMCHK -r命令改善性能,并且出现故障的时候恢复相对比较困难
  • 压缩表:
    压缩表由myisam工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支

2.1.3 适用的生产环境

  • 生产环境不需要事务的支持
  • 单方面读或写入数据较多的业务
  • 不适合读写频繁场景
  • 对事务要求不高的业务
  • 不需要过高的硬件场景

2.2 InnoDB

特点

  • 支持事务,支持四个事务隔离级别
  • 读取阻塞与事务隔离级别相关
  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间、类似oracle数据库
  • 支持外键约束,5.5前不支持全文索引,5.5之后支持全文索引

3.查看存储引擎

3.1 查看系统支持的存储引擎

在这里插入图片描述

3.2 查看表使用的存储引擎

  • 方法一
    在这里插入图片描述
  • 方法二
    在这里插入图片描述

4.修改存储引擎

  • 方法一: 通过alter table修改
    在这里插入图片描述
  • 方法二 :修改配置,指定默认存储引擎
    在这里插入图片描述
    在这里插入图片描述
  • 方法三 : 创建表时指定存储引擎
  • 在这里插入图片描述

总结

数据库事务的ACID特性
mysql事务命令有bein,commit,rollback,savepoint
MyISAM适合在无事务要求,读写并发少的场景使用
InnoDB适合在有事务要求,读写并发多的场景使用

以上是关于MySQl事务与存储引擎的主要内容,如果未能解决你的问题,请参考以下文章

MySQL------MySQL 索引事务与存储引擎

MySQL 索引事务与存储引擎

MySQL数据库的事务与存储引擎

MySQL索引事务与存储引擎

MySQL 事务 与 存储引擎

MySQL索引事务与存储引擎