Mysql 锁

myISAM和MEMORY存储引擎采用的是表级锁table-level locking

死锁
所谓死锁<DeadLock>: 是指两个或两个以上的进程在执行过程中,
因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.
 
表级锁不会产生死锁.所以解决死锁主要还是真对于最常用的InnoDB.
 
在遇到问题时

先执行show processlist找到死锁线程号.然后Kill processNo
 
当然主要解决还是需要去看一下具体的操作.可能产生死锁
Show innodb status检查引擎状态 ,可以看到哪些语句产生死锁

SHOW PROCESSLIST查看数据库中表的状态,是否被锁;

kill id   //杀掉被锁的表

innodb的锁实现   
    innodb 行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同。
    Oracle是通过在数据块中对相应的数据行加锁来实现的。
    而innodb则是只有通过索引调价检索数据,innodb才使用行锁,否则,innodb将使用表锁

   (1)在不通过索引条件查询的时候,innodb确实使用的是表锁,而不是行锁
   (2)由于行锁是针对索引加的锁,不是针对记录加的锁,所以,虽然访问不同行的记录,
            但是如果是使用相同的索引键,是会出现锁冲突
   (3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,
            另外,无论是使用主键索引、唯一索引或普通索引,innodb都会使用行锁来对数据加锁
    (4)即便条件中使用了索引字段,但是是否使用索引来检索数据是由MySQL通过判断不同
             的执行代价来决定的,
             如果MySQL认为全表扫描效率高,比如对一些很小的表,他就不使用索引
             这时候,使用表锁,而不是行锁。

posted on 2015-04-15 18:08  hi_rain  阅读(181)  评论(0)    收藏  举报