mysql锁(行锁,表锁,页面锁)


MySQL常用存储引擎的锁机制
MyISAM和MEMORY : 表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁:页面锁
InnoDB:表级锁,默认为行级锁

mysql有三种锁:行锁,表锁,页面锁。
三种锁的对比:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

Innodb中的行锁与表锁选择
InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引(主键索引、唯一索引或普通索引)条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

行级锁,表锁又分为共享锁(lock in share mode)和 排他锁(for update):
默认:数据库的增删改操作都会加排他锁,而查询不会加任何锁。
共享锁(乐观锁|S锁):允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁;
select ... from table where id = xxx lock in share mode;
排他锁(悲观锁|X锁):当一个事务加入排他锁后,不允许其他事务加共享锁或者排它锁读取,更加不允许其他事务修改加锁的行。
select ... from table where id = xxx for update;


避免死锁
1、不同程序并发存取多个表时,尽量约定以相同的顺序访问表。
2、同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;


 

你可能感兴趣的:(Mysql)