MySQL锁机制与MVCC

1.MySQL服务器架构图

MySQL锁机制与MVCC

其实其底层构造和普通的网络服务器有相似之处,解析器等主要负责SQL语句的解析,而所谓的存储引擎其实本质就相当于是Linux上的文件系统层,这样来看就清楚的多了,这说明MySQL必定会为我们提高一个统一的访问入口而不必去底层自己设计,这大大降低了数据库的使用门槛。

2.共享锁和排他锁

  • 共享锁(读锁):共享资源,用于不更改或不更新数据的操作(只读操作),如 SELECT 语句
  • 排他锁(写锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。一个写锁会阻塞其他的写锁和读锁
    1.锁粒度
    简而言之,锁粒度就是我们使用数据库的行锁或者表锁时锁定数据量的大小。
    一般来说锁粒度越小系统并发性能越好,但同时加锁时消耗的系统资源也会大大增加。因此在系统开销和数据库安全性之间找到一个平衡,也就是说选择合适的锁策略至关重要。
    2.表锁(table lock)
    作用就和名字一样会锁定整张表,某用户写数据时会获取写锁,读时使用读锁,读锁之间互不阻塞。
    3.行级锁(row lock)
    使用行级锁可以最大程度的支持并发处理,当然此时开销也最大,同时row lock只在存储引擎层进行实现,而和MySQL服务器层无关。
    避免死锁的方法:死锁检测和死锁超时超时机制,一般采用死锁检测然后立刻回滚的策略实现

3.MVCC(多版本并发控制)

MVCC只工作在read committed和repeatable read两种隔离级别之下,不支持其他的隔离级别。
简单来说MVCC就是通过使用其他类型的辅助数据避免了在多种情况下的加读锁的操作,进一步提升了并发的性能。同时也解决了在repeatable read时会造成幻读的现象
而所谓的辅助数据其实就是存储引擎会为每一行数据存储两列隐藏数据,分别是创建时间和删除时间,创建时间是插入行时的系统版本号,删除时间要么是未定义的要么就会是删除该行时的系统版本号,需要注意的是系统版本号再开机之后每开始一个新的事务就会递增事务版本号。
下图详细描述了InnoDB的MVCC在repeatable read隔离级别下的工作方式:
MySQL锁机制与MVCC

4.InnoDB与MyISAM

myisam与innodb的区别:

  • 事务: InnoDB支持事务,而MyISAM不支持事务
  • 锁: InnoDB支持行级锁,而MyISAM只支持表级锁
  • MVCC: InnoDB支持MVCC, 而MyISAM不支持
  • InnoDB支持外键,而MyISAM不支持
  • InnoDB不支持全文索引,而MyISAM支持
  • 索引: InnoDB是聚集索引,而MyISAM是非聚集索引

5.索引的组织形式

详见下面博文
数据库进阶(文件的组织方式和索引)