摘要


  1. InnoDB 和MyISAM比较
  2. InnoDB锁机制
  3. Mysql 隔离级别

一,InnoDB和MyISAM比较


Mysql 存储引擎默认是MyISAM,但是随着对事务和并发的要求越来越高,便引入了InnoDB引擎,它具有支持事务安全等一系列特性。


  1. InnoDB主要支持事物,外键和行锁,MyISAM不支持事物只有表锁。
  2. MyISAM 执行select 性能高。
  3. InnoDB  执行 insert update 性能高。
  4. 如果做Mysql  集群时,主库 负责 写操作(InnoDB) 从库负责读操作(MyISAM)。

二,InnoDB锁机制


行锁(开销大,加锁慢,会出现死锁)
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。(读锁)
排他锁(X):允许获得排他锁的事务更新数据,但是组织其他事务获得相同数据集的共享锁和排他锁。(写锁)

表锁(开销小,加锁快,不会出现死锁)
意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁


意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。



注意




  1. Mysql InnoDB 引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型。
  2. 如果查询语句加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。
  3. InnoDB行锁实现:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁
  4. InnoDB会自动对主键,外键添加索引、人为删除外键索引会报错,索引查看 show index from tbname; 


三,隔离级别


先查看隔离级别 SELECT @@tx_isolation可知 Mysql 的默认隔离级别为 REPEATABLE-READ


Mysql 四个隔离级别


第1级别:Read Uncommitted(读取未提交内容)  
第2级别:Read Committed(读取提交内容)
第3级别:Repeatable Read(可重读)
第4级别:Serializable(可串行化)


级别的问题


脏读:一个事物可以看到另一个事物中修改的数据。
不重复读:同一个事务执行过程中,先后两次读到的数据结果会不一致。(select -update -select)
幻读:解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。
但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。




mysql innodb insert会锁表吗 mysql innodb锁机制_数据