MySQL数据库事务、隔离级别 InnoDB、MyISAM引擎区别、相关知识点

事务、隔离级别:

前言:提到一个关系数据库就绕不开事务、隔离级别的讨论,所以先来看一下什么是数据库的事务及隔离级别。

  • 事务:事务就是将很多个操作集中在一块形成一个有限的操作集,然后对之及进行执行;对于一个事务的执行结果只有两种结果,是全部执行成功并提交到数据库中,对数据进行持久的影响,是事务中有一个或者多个操作没能成功执行最终导致事务的执行整体失败,进而回滚到事务开始之前的数据库状态。对于数据库事务的ACID特性描述如下表:
A(原子性,Atomicity)就像是以往所学习到的原子一样,是不可拆分的;其在事务中表现就是这个事务要么全部执行成功并得到提交;或者是执行失败回滚到事务开始前数据库的状态 ,导致回滚的可能不仅这一项,还有可能是关于自动提交的问题(具体见下面的介绍)
C(一致性,Consistency)就像是字面的意思一般,一致性就是指数据库会从一个状态随着事务的成功执行由一个一致状态迁移另一个一致状态;所谓的一致状态就是数据库中数据满足完整性约束
I(隔离性,Isolation)隔离就是你我可能很近,但是彼此互不影响;也就是指在事务彼此之间是互相不影响的
D(持久性,Durability)持久性是对于一个事务提交后对数据库影响来说的,是指一个事务一旦执行成功并提交后,对于数据库影响是永久性的

补充一点:

       [^1]**关于事务的提交:**
      默认情况下,数据库会对事务的执行提供自动提交服务,
      但是对于一些特殊要求,需要设定手动的对事务进行提交操作,这个时候事务执行后的提交/回滚结果就不会十分明了了,便会有值得去思考的问题了。
       1.手动提交模式,执行之后显式的提交“Commit”/“rollback”--->能够完成对事务的提交/回滚操作;
       2.手动提交模式,执行之后直接进行系统的退出操作;此时系统也对此有所设计考虑:
             2.1  正常的退出系统,此时系统会默认隐式对此前执行的事务进行 提交操作;
             2.2  异常的退出系统,此时系统会默认隐式对所执行的事务进行 回滚操作。
       [^2]**关于完整性约束(摘自百度)**
       关系完整性约束是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。
       完整性通常包括域完整性,实体完整性、参照完整性和用户定义完整性,
       其中域完整性,实体完整性和参照完整性,是关系模型必须满足的完整性约束条件。
  • 隔离级别:
    简单说,隔离级别就是对于上述原子特性中隔离性的具体情节定义讨论,其中大体分为以下几个情况:
读未提交数据就是允许事务读取还没有被其他事务提交的数据,这种情况下会出现脏读、幻读、不可重复读的问题
读已提交数据只允许事务读取其他事务已经提交的数据,此种级别解决了脏读的问题,但还是不能彻底解决不可重复读、幻读的问题
可重复读确保事务能够多次从一个字段中读取相同的数据值,在此事务期间不允许其他事务进行对数据变更,避免了脏读、不可重复的问题,但是幻读仍可能出现
可串行化(序列化)确保一个事务可以从一个表中读取相同的行,在此事务持续的期间禁止其他事务对该表进行更新、插入、删除等操作,可以避免所有的并发问题,但是此种情形性能极低

常见的数据库中 , Oracle数据库是支持读已提交,MySQL数据库是支持可重复读的,随着隔离级别的提升,对应性能效率会降低,所以在具体选择时,需要综合各个方面进行考虑。(倘若有看官需要具体的动手实践,验证以上的部分,可以参考此人的文章—
点此进入文章查看,于此不提供具体的执行方法)。

InnoDB、MyISAM引擎的区别:

此处我选择从第三者角度来进行描述,便于区分理解;

  1. 存储结构:MyISAM在磁盘上存储文件有三类:<1>.frm 负责存储表定义信息 <2>.myd 数据文件的相关信息 <3>.myi 索引文件相关信息; InnoDB文件有两类:<1>idb 数据文件 <2> frm 定义相关信息文件

  2. 存储空间: MyISAM可以被压缩,存储空间较小,能够支持三类不同的存储格式:静态表、动态表、压缩表;InnoDB需要更加多的内存及存储,需要在内存中建立专用的缓冲池进行缓冲数据和索引;

  3. 可移植性、备份恢复: MyISAM以文件形式进行数据存储,跨平台进行数据库的移植时比较便捷,备份恢复也可单独的对具体的表进行;InnoDB具有免费方案,能够拷贝数据文件,备份binlog或者是使用mysqldump ,但是在处理大型数据量时不方便(如几个TG);

  4. 事务支持: MyISAM强调性能,每一个查询具有原子性,执行速度上比InnoDB快,不提供事务支持(不支持commit / roolback操作,);InnoDB提供事务支持,外键等给及数据库功能(commit roolback 数据库的崩溃修复等);

  5. 全文索引: MyISAM支持FullTEXT类型的全文索引;InnoDB不支持全文索引,但是可以通过使用Sphinx插件进行实现全文索引功能;

  6. 表主键: InnoDB要求是必须要有主键的,MyISAM则能接受没有主键;

  7. 表的行数: MyISAM具有一个计数器,能够对自己操作表行数进行记录保存,使用select count ( *) from tablename; 就可得到,InnoDB 不保存相应的行数记录值,要知道具体的行数需要进行遍历,耗时费力; 献上一题,若是一个表有6行,两个引擎中都有,然后均删除第4、5、6行数据,关机/断电/其他意外导致数据库重启了;添加数据时行号问题(可自行思考实验,这样记得更深);

  8. 外键的支持: InnoDB支持外键,MyISAM不支持;

  9. 锁: InnoDB支持行级锁,粒度更小;MyISAM则提供表级锁;
    关于锁及查询速度上可以查看这位老哥的帖子
    点击查看

如何选择:

上面也说了关于两个引擎之间的差别,但是有时候却依旧不知道该怎么去抉择,以下提供几个思路:
<1> 需要严格的事务支持,优先考虑InnoDB;
抛开事务支持不谈
<2> 要提供高速存储和全文搜索能力,优先考虑MyISAM;
<3> 要求性能好、操作执行查询多、频繁,优先考虑MyISAM;
<4>查询操作不是那么多,而是对表的更新、修改操作频繁、多时,优先考虑InnoDB;
<5>主外键要求,优先考虑InnoDB;
<6>崩溃修复时易恢复优先考虑InnoDB。
<><><><><>等等;

最后;如果有不正确的地方,欢迎大家指正! 一个努力学习的渣渣会十分感谢的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值