MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
lock table tbl_name read/write;
unlock tables;
lock table tbl_name read local; (其它会话可以插入数据)
unlock tables; (在锁释放前,无法读取其它会话插入的数据)
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
show status like 'table%';
--如果Table_locks_waited的值比较高,则说明存在着较严重的表级锁争用情况。
可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:
show status like 'innodb_row_lock%';
--如果发现锁争用比较严重,如InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比较高
1、 在不通过索引条件查询的时候,innodb使用的是表锁而不是行锁
2、 在通过索引进行条件查询,innodb使用的是行锁
3、 由于mysql的行锁是针对索引加的锁,不是针对记录加的锁,所以对于非唯一索引,即使访问不同行的记录,也无法访问到具体的数据