Mysql事务及存储引擎

一、Mysql事务

  1.1 Mysql事务的概念

    所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

  1.2 事务的ACID特点

    事务应该具有的四个特性:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)

  • 原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
  • 隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
  • 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

  1.3 事务的相互影响

  1. 脏读(读取未提交数据):脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据
  2. 不可重复读(前后多次读取,数据内容不一致):一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
  3. 幻读(前后多次读取,数据总量不一致):一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。
  4. 丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

二、mysql事务隔离级别

隔离级别 含义 特点
read uncommitted 读取尚未提交的数据 :不解决脏读,允许脏读,其他事务只要修改了数未提交读 安全性最差,但性能最好(不使用)
read committed 提交读:读取已经提交的数据,可以解决脏读,只能读取到已经提交的数据
安全性较差 ,性能较好(Oracle数据库默认)
repeatable read 可重复度,重读读取,可以解决脏读 和 不可重复读 —mysql默认的可重复读 安全性较高,性能较差(mysql默认)
serializable 串行化:可以解决脏读、不可重复读和虚读----相当于锁表;完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。 安全性高,性能差(不使用)

  注意mysql默认的事务处理级别是repeatable read ,而OracleSQLServerread committed

  2.1 事务隔离级别的作用范围

  • 全局级:对所有的会话有效
  • 会话级:只对当前的会话有效

  2.1.1 查询全局事务隔离级别

show global variables like '%isolation%';


SELECT @@global.tx_isolation;

 

  2.1.2 查询会话事务隔离级别

方法一:show session variables like '%isolation%';


方法二:SELECT @@session.tx_isolation; 


方法三:SELECT @@tx_isolation;

  2.1.3 设置全局事务隔离级别

set global transaction isolation level read committed;

  2.1.4 设置会话事务隔离级别

set session transaction isolation level read committed; 

三、事务控制语句

事务控制语句 含义
BEGIN 或 START TRANSACTION 显式地开启一个事务
COMMIT 或 COMMIT WORK 提交事务,并使已对数据库进行的所有修改变为永久性的
ROLLBACK 或 ROLLBACK WORK 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
SAVEPOINT S1 使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT。举例:S1代表回滚点名称
ROLLBACK TO [SAVEPOINT] S1 把事务回滚到标记点

 

  3.1 实例操作

  3.1.1 创建数据库和表,并往里插入值

create database light;

use light;

方法一:create table baby(id int(10) primary key not null,name varchar(50) not null,monet char(10) not null);

方法二:create table baby(id int(10) not null,name varchar(50) not null,monet char(10) not null,primary key(id));

insert into baby values(1.'FIRST',500);

insert into baby values(2,'SECOND',700);

select * from baby;

   3.1.2 测试提交事务

begin

update baby set monet = monet - 50 where name = 'FIRST';

select * from baby;


quit

mysql -u root -p

use light;

select * from baby;

     在开始事务时,更新FIRST数据一切正常运行,退出

    退出后,重新查看数据表时,发现数据回到初始状态

  3.1.3 测试回滚事务

begin

update baby set monet= moent + 85 where name = 'FIRST';

select * from baby;

savepoint S1;

update baby set monet= moent + 15 where name = 'SECOND';

select * from baby;

savepoint S2;

insert into baby values(3,'SECOND'.600);

select * from baby;


ROLLBACK TO S1;


select * from baby;

 四、使用 set 设置控制事务

SET AUTOCOMMIT=0; 禁止自动提交
SET AUTOCOMMIT=1; 开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; 查看Mysql中的AUTOCOMMIT值

    如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback、commit当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
    如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。当然无论开启与否begin、commit、rollback都是独立的事务。

五、存储引擎概念介绍

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

  5.1 MySQL常用的存储引擎

  • MyISAM
  • InnoDB

    MySQL数据库中的组件,负责执行实际的数据I/O操作。
    MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

  5.1.1 MyISAM  

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

    特点:访问速度快,对事务完整性没有要求
    应用场景:MyISAM 适合查询、插入为主
    MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:

  • 文件存储表结构.frm
  • 数据文件的扩展名为 .MYD (MYData)
  • 索引文件的扩展名是 .MYI (MYIndex)

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

    总结

  • MyIsam 是表级锁定,读或写无法同时进行
  • 优点:分开执行时,速度快、资源占用相对较少

  5.1.1.1 MyISAM 表支持 3 种不同的存储格式
存储格式 含义 优点 缺点
静态(固定长度)表 静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的
  • 存储非常迅速
  • 容易缓存
  • 出现故障容易恢复
占用空间多
动态表 动态表包含可变字段(varchar),记录不是固定长度的,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能 占用空间较少
  • 更新频繁
  • 删除较麻烦
  • 故障恢复相对困难
压缩表 压缩表由 myisamchk 工具创建 占据空间小

  5.1.1.2 MyISAM适用的生产场景

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

  5.1.2 InnoDB

  5.1.2.1 InnoDB特点
  1. 支持事务,支持4个事务隔离级别
  2. 读写阻塞与事务隔离级别相关
  3. 能非常高效的缓存索引和数据
  4. 表与主键以簇的方式存储
  5. 支持分区、表空间,类似oracle数据库
  6. 支持外键约束
  7. 对硬件资源要求还是比较高的场合
  8. 行级锁定,但是全表扫描仍然会是表级锁定

  

  5.1.2.2 InnoDB和MyISAM的区别

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

    但是在 MyISAM 表中可以和其他字段一起建立组合索引

    清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表

  5.1.2.3 死锁
  • MyISAM :表级锁定
  • innodb :行级锁定

  目的:当两个请求分别访问/读取2行记录,同时又需要读取对方的记录数据,因为(行锁的限制)而造成了阻塞的现象

  需求:怎么解决死锁?

  过程例如:

show

heihei_lei

select * from heihei_lei;

  5.1.2.3.1 MyISAM和innodb死锁的特点

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;


行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高; 

  MyISAM不支持事务,也不支持外键约束,只支持全文索引数据文件索引文件是分开保存的,需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景 

  5.1.2.3.1.1 支持的字段和数据类型
  • 所有引擎都支持通用的数据类型
  • 但不是所有的引擎都支持其它的字段类型,如二进制对象
     
  5.1.2.3.1.2 锁定类型

    不同的存储引擎支持不同级别的锁定

  • 表锁定: MyISAM 支持
  • 行锁定: InnoDB 支持

  5.1.2.3.1.3 索引的支持
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能
  • 不同的存储引擎提供不同的制作索引的技术
  • 有些存储引擎根本不支持索引

  5.1.2.3.1.4 事务处理的支持
  • 提高在向表中更新和插入信息期间的可靠性    
  • 可根据企业业务是否要支持事务选择存储引擎innodb

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

show engines; 

  5.3 查看表使用的存储引擎

show table status from heihei where name='lei'\G;

    方法一 :

    方法二: 

show create table lei; 

  四、修改存储引擎

alter table lei engine = MYISAM;

show create table lei;

相关推荐

  1. MySQL索引、事务存储引擎

    2024-03-26 04:04:02       49 阅读
  2. MySQL 中的事务存储引擎

    2024-03-26 04:04:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 04:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 04:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 04:04:02       82 阅读
  4. Python语言-面向对象

    2024-03-26 04:04:02       91 阅读

热门阅读

  1. 绘制虚线圆角矩形的Flutter小部件

    2024-03-26 04:04:02       45 阅读
  2. 5.81 BCC工具之tcpconnlat.py解读

    2024-03-26 04:04:02       62 阅读
  3. ROS2 高效学习系列

    2024-03-26 04:04:02       36 阅读
  4. 图像分类的实战案例

    2024-03-26 04:04:02       39 阅读
  5. c# 与c++类型对应关系

    2024-03-26 04:04:02       39 阅读
  6. 【算法】堆排序

    2024-03-26 04:04:02       40 阅读
  7. IOS面试题编程机制 41-45

    2024-03-26 04:04:02       38 阅读
  8. Spring事务核心:声明式事务&注解式事务

    2024-03-26 04:04:02       47 阅读
  9. c++翁恺

    c++翁恺

    2024-03-26 04:04:02      44 阅读
  10. 离婚时夫妻共有房屋的分割原则及方式

    2024-03-26 04:04:02       50 阅读
  11. 设计模式---单例模式

    2024-03-26 04:04:02       49 阅读