MySQL的锁机制不一样的存储引擎支持不一样的锁机制,分为表级锁、行级锁、页面锁。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认状况下是采用行级锁mysql
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的几率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的几率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度通常 sql
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。 并发
对MyISAM表的读操做,不会阻塞其余用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操做,则会阻塞其余用户对同一表的读和写操做。spa
MyISAM在执行查询语句(SELECT)前,会自动给涉及的全部表加读锁,在执行更新操做 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不须要用户干预,所以,用户通常不须要直接用LOCK TABLE命令给MyISAM表显式加锁。code
InnoDB与MyISAM的最大不一样有两点:一是支持事务(TRANSACTION);二是采用了行级锁。blog
行级锁也支持读锁和写锁两类。索引
mysql InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,若是加排他锁可使用select …for update语句,加共享锁可使用select … lock in share mode语句。因此加过排他锁的数据行在其余事务种是不能修改数据的,也不能经过for update和lock in share mode锁的方式查询数据,但能够直接经过select …from…查询数据,由于普通查询没有任何锁机制。事务
InnoDB行锁是经过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不一样,后者是经过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特色意味着:只有经过索引条件检索数据,并请求共享或排他锁时,InnoDB才使用行级锁,不然,InnoDB将使用表锁! it
当咱们用范围条件检索数据或者使用相等条件请求给一个不存在的记录加锁,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的 索引项加锁用范围条件检索数据table
举例来讲,假如表中只有5条记录,其empid的值分别是一、二、三、六、7
Select * from emp where id > 6 for update; 锁定【6,无限大】区间 Select * from emp where id=5 for update; 锁定【3,6】区间 Select * from emp where id=3 for update; 锁定3这一行