一、MVCC简介
MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能
读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁:又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。
行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。
一、什么是锁
锁机制是用于管理对共享资源的并发访问。
在数据库中,lock与latch都可以被称为锁。latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短, lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。
latch一般用于锁住事务号,内存等一些资源。而lock一般用于锁住记录,latch基本用户感知不到,lock可能是我们需要经常感知到的,下面介绍的锁为lock锁。
二、 锁的分类
mysql存在多种不同的引擎,各种不同引擎类型面对的使用场景不一样,不同引擎之间的锁粒度可能有差别。 例:innodb能支持行级锁,myISAM支持表级锁,BDB支持页级锁,他们的特定如下:
1: 行级锁具有较高的并发性,比较适合并发度较高的场景,同时也更耗费资源。 但是如果锁住大量的记录,会比页级锁或者表级锁更慢,需要获取大量锁资源。
2:表级锁消耗资源更少,但是并发读较低。比较适合需要经常锁住大量数据的场景。
3:页级锁界于行锁以及表级锁之间,但是在无法解决热点数据的并发问题。
接下来分别创建两张不同引擎的表,分别演示分别在myisam以及innodb大量数据插入的情况下,另一个会话更新一条数据的block状态。以及锁类型,模拟过程为:
(1):创建一张myisam(myisam_lock_test)或者是innodb引擎的表(innodb_lock_test)。
(2):开启一个会话sessionA,插入一条数据。
(3):使用load指令进行大量数据插入。
(4):开启另一个会话更新步骤二张插入的数据。