专栏首页Java小王子InnoDB与MyISAM的最大不同有两点
原创

InnoDB与MyISAM的最大不同有两点

一是支持事务(TRANSACTION);

二是采用了行级锁。

行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题。下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题。

事务

  事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。   事务用来管理 insert,update,delete 语句   一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性) 1、原子性:一组事务,要么全部成功;要么撤回。 2、一致性 :满足模式锁指定的约束,比如银行转账前后总金额应该不变。事务结束时,所有的内部数据结构(如B树索引)也都必须是正确的。 3、隔离性:事务独立运行。一个事务所做的修改在最终提交之前,对其它事务是不可见的。事务的100%隔离,需要牺牲速度。 4、持久性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改,或者通过数据库备份和恢复来保证。

注意几点

  1. 在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。
  2. 在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。即对于独立的每条sql语句,mysql会自动提交或者回滚。
  3. 如果要执行多条SQL语句组成的事务,可以显式地使用命令 BEGIN 或 START TRANSACTION开启事务,使用commit或rollback结束事务。(或者执行命令 SET AUTOCOMMIT=0,用来禁止当前会话使用自动提交,但是这种方式不推荐。)
  4. 在InnoDB的事务中,对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据行加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁(通过多版本并发控制实现,同时有效的解决了幻读的问题)。
  5. 折返点:比如设置折返点:SAVEPOINT adqoo_1,然后利用ROLLBACK TO SAVEPOINT adqoo_1实现发生在折返点 adqoo_1 之前的事务被提交,之后的被忽略。
  6. 乐观锁,即通过version来实现当并发冲突发生时,冲突的SQL语句会执行失败,然后重试或者放弃或者交给用户处理,但不能保证事务的ACID特性。(注意:update seckill set number = number -1 where seckill_id = 1000 lock in share mode;是错误的,lock in share mode和for update只能用在select语句中)
  7. InnoDB采用的是两阶段锁定协议。在事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT或者ROLLBACK时才会释放,并且所有的锁是在同一时刻被释放。所以在一个事务中,推荐最后执行需要独占(获得读锁)的行,尽量减少行锁持有的时间。
  8. InnoDB目前处理死锁的方法是:将持有最少行级排它锁的事务回滚。如果是因为死锁引起的回滚,可以考虑在应用程序中重新执行。
  9. 在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁,更新时再申请排他锁,因为当用户申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL存储引擎MyISAM与InnoDB的区别

    在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

    黄啊码
  • MySQL存储引擎MyISAM与InnoDB区别总结整理

    在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

    Java后端技术
  • MySQL存储引擎之Myisam和Innodb总结性梳理

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM...

    洗尽了浮华
  • MySQL 存储引擎 InnoDB 与 MyISAM 的区别

    MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用: MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(Berke...

    魏晓蕾
  • MySQL - 常用存储引擎区别总结(2020最新版)

    为什么先说InnoDB?InnoDB 从 MySQL5.5(2010年) 版本代替 MyISAM 成为默认引擎,可以说只要玩儿过 MySQL 的,都用过Inno...

    陈哈哈
  • MySQL中MyISAM与InnoDB存储的区别

    程序你好
  • 「Mysql索引原理(一)」1.存储引擎简介

    0. 前言 1. 存储引擎查看 2. InnoDB存储引擎特性存储InnoDB历史 3. MyISAM存储引擎前言特性加锁与并发修复索引特性延迟更新索引键...

    源码之路
  • MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用 B-Tree(B 树)或其变种 B+Tree(B+树)作为索引结构。B+Tree 是数据库系统实现索引的首选数据结构。

    desperate633
  • MySQL中 InnoDB 和 MyISAM 小结

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级...

    阳光岛主
  • MySQL中MyISAM和InnoDB的索引方式以及区别与选择

    索引是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引。可简单理解为排好序的快速查找数据结构。如果要查“...

    码农编程进阶笔记
  • 第16期:索引设计(MySQL 的索引结构)

    上一章(第15期:索引设计(索引组织方式 B+ 树))讲了数据库基本上都用 B+ 树来存储索引的原因:适合磁盘存储,能够充分利用多叉平衡树的特性,磁盘预读,并且...

    爱可生开源社区
  • mysql各种引擎对比、实战

    sunsky
  • 温故而知新:MySQL存储引擎入门介绍

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地...

    用户5546570
  • MySQL索引实现

    我们上一篇讲了MySQL索引背后的数据结构及算法原理,我们知道了为什么使用索引查询数据效率那么高的原理了,我们接着看看MySQL的索引是如何实现的。

    互扯程序
  • MySQL有哪些存储引擎,各自的优缺点,应用场景

    经常面试都会问到MYSQL有哪些存储引擎,以及各自的优缺点。今天主要分享常见的存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB...

    Java
  • MySQL - MySQL不同存储引擎下索引的实现

    MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,我们这里主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。

    小小工匠
  • 怎么优雅的选择 MySQL 存储引擎

    对于数据库这一块询问比较多的就是在 MySQL 中怎么去选择一种何时当前业务需求的存储引擎,而 MySQL 中支持的存储引擎又有很多种,那么 MySQL 中分别...

    Meng小羽
  • Python数据库操作 Mysql数据库表引擎与字符集#学习猿地

    ![](./imgs/752951346A5F4E7EBDE362FA97107707.png)

    学习猿地
  • Python数据库操作 Mysql数据库表引擎与字符集#学习猿地

    ![](./imgs/752951346A5F4E7EBDE362FA97107707.png)

    学习猿地

扫码关注云+社区

领取腾讯云代金券