zoukankan      html  css  js  c++  java
  • 复盘MySQL(存储引擎、事务)通俗易懂!

    如果你对这三个东西还不清楚,我相信阅读本篇博客会使你正确认识他们。

    进入正题前,建议你带着这几个问题食用~

    1. xxx是什么?
    2. xxx怎么用?
    3. 为什么要用xxx?

    存储引擎

    简介 :用大白话来说,存储引擎就是表存储/组织数据的方式,每个表都可以指定存储引擎,不同的存储引擎组织数据的方式不一样。(注:存储引擎是MySQL特有的术语,其他数据库也有这东西,但不叫这名字)


    A、如何使用?
    就在建表的时候,往小括号后边用 “ENGINE”来指定即可


    B、MySQL支持哪些存储引擎?
    输入一条命令即可查看;如下图,MySQL支持这九种存储引擎,并且版本不同支持情况不同


    C、常用存储引擎?
    作为一名java程序猿,我们了解常用的几种存储引擎即可

    第一种:【MyISAM】

    它是最常用的存储引擎
    当某张表被它管理后,会以数据库目录的三个文件来表示那张表。即创建了一张表,就会生成三个文件(如下:)
    1、格式文件(xxx.frm):存储表结构
    2、数据文件(xxx.myd):存储表内容
    3、索引文件(xxx.myi):存储表索引

    优势:这仨兄弟可以被压缩、转换为只读,这样可以节省空间
    劣势:不支持事务


    第二种:【InnoDB】

    它是MySQL默认的存储引擎
    当某张表被它管理后,会以数据库目录中的一个(.frm)文件来表示那张表。即创建了一张表,就会生成一个文件

    优势:支持事务、支持“数据库崩溃后自动恢复”机制、非常安全、是默认的
    劣势:重量级,效率不是很高


    第三种:【MEMORY】

    当某张表被它管理后,会以数据库目录中的一个(.frm)文件来表示那张表。即创建了一张表,就会生成一个文件
    这张表的数据和索引存储在内存中,所以其速度会非常快,

    优势:查询效率高;不用和硬盘交互
    劣势:不安全,数据断电即失;不支持事务

    (注:内存和硬盘的区别?内存直接取,电流的速度,而硬盘是机械行为)


    事务(敲黑板!!!)

    简介:一个事务就是一个完整的业务逻辑,这个业务时最小的逻辑单元,不可再分,要么同时成功,要么同时失败。
    只有DML语句(数据操纵语言,即【增删改】)才会有事务一说,其余语句与事务无关。



    注意,问题来了!

    A、为何会存在事务一说?

    就是在要完成某项业务时,需要多条DML语句共同完成。假如一条就能完成,那就不需要事务了……


    B、事务的本质?

    本质上就是多条sql语句同时成功或同时失败


    C、事务操作?
    注意:MySQL默认是自动提交的,即执行一条DML语句就提交一次。但我们可是要多条执行完一起提交的,这可就得关掉自动提交了~
    其实,打开事务的命令就是表示关闭自动提交事务的

    开启事务(关闭自动提交):start transaction;

    提交事务:commit;

    回滚事务:rollback;


    D、事务是咋做到同时成功/失败的?

    有一个叫【事务性活动】的文件,在事务执行过程中,每条语句的操作都会记录在其中。
    1、当我们提交事务时:之前所进行的DML语句产生的数据会被持久化到数据库表中,并清空文件里的内容
    2、当我们回滚事务时:之前所进行的DML语句操作将会被全部撤销,并清空文件里的内容


    E、事务的特性?

    A:原子性。最小的工作单元,不可再分
    C:一致性。同时成功或同时失败
    I:隔离性。A事务和B事务之间有隔离
    D:持久性。事务提交后,事务执行所产生的数据将会被持久化到数据库表中


    F、隔离级别?
    这个可是重中之重,面试的百年老题了。答应我,好好看,可以吗?

    隔离:事务A和事务B之间有一道墙;
    级别:墙的厚度,级别越高,墙越厚。

    MySQL有四个隔离级别,且听我慢慢道来~

    1. 读未提交【read uncommitted】
      最低的隔离级别,就是说 事务A在执行过程中,能够读取到事务B已执行但未提交的数据结果
      存在的问题:脏读(Dirty Read),即读到了脏数据。这种隔离级别已经是理论上的了,因为大多数据库使用的都是二挡起步,没人用这种。

    2. 读已提交【read committed】
      事务A只能读到事务B已执行并且已提交的数据,解决了脏读问题,每一次读到的都是真实的数据
      存在的问题:不可重复读

    3. 可重复读【repeatable read】
      MySQL默认的隔离级别,就是事务A开启后,并且没有提交或回滚之前,读取到的数据都是停留在刚开启事务的时候,即便事务B修改了表中的数据,事务A读到的还是事务B提交之前的数据。这就解决了不可重复读的问题,但是也迎来了新的问题:幻读
      (举个例子:比如一个事务A,它从开始执行到执行结束,花了一个小时。那么在这一个小时内,无论其他事务提交了多少次,数据被修改多少次,丝毫不会影响到事务A,它操作的数据还是其他事务提交之前的。)

    4. 序列化/串联化【serializable】
      最高的隔离级别,解决了所有问题,但是效率最低。这种隔离级别表示让事务排队执行,就类似于 synchronized,每一次读取到的数据都是真实的。
      (举个例子:当事务A在执行时,事务B想执行?不允许,后边排队去,等事务A执行完才到事务B执行)


    G、查看当前隔离级别?

    select @@tx_isolation


    H、设置隔离级别?

    如:将隔离级别设置为读未提交
    set global translation isolation level read uncommitted;





    作者:命运使然
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    SQL SERVER 2016研究三
    SQL SERVER 2016研究二
    SQL SERVER 2016研究一
    codeforce div2 426 D. The Bakery
    bzoj2190: [SDOI2008]仪仗队
    长路
    codechef AUG17 T5 Chef And Fibonacci Array
    codechef AUG17 T4 Palindromic Game
    codechef AUG17 T3 Greedy Candidates
    汕头市队赛 SRM10 dp只会看规律 && bzoj1766
  • 原文地址:https://www.cnblogs.com/wfg934dbk/p/15232339.html
Copyright © 2011-2022 走看看