对MySQL中行级锁、表级锁、页级锁的理解


a.MySQL常用存储引擎的锁机制:
    MyISAM和MEMORY采用表级锁(table-level locking)
    BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
    InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
    按照锁的粒度从小到大把数据库锁分为行级锁(INNODB引擎)、页级锁(BDB引擎 )和表级锁(MYISAM引擎)。

b.在Innodb引擎中既支持行锁也支持表锁,那么什么时候会锁住整张表,什么时候或只锁住一行呢?
 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。        InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

c.死锁一般发生在具有行级锁功能的InnoDB引擎中。
当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。
发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。

d.有多种方法可以避免死锁,这里只介绍常见的三种
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

你可能感兴趣的:(MySQL)