请问为什么在mysql中表锁不会出现死锁而行锁会出现死锁?

解决方案 »

  1.   

    为什么说 "mysql中表锁不会出现死锁" ?
      

  2.   

    myisam中的表锁不会出现死锁,而innodb中的行锁会出现死锁?
      

  3.   

    《深入浅出mysql数据库开发,优化与管理维护》中P263页中讲到的,但我没想明白是为什么?
      

  4.   

    说说我的看法,不是因为行锁和表锁的原因,倒却是因为是否支持事务的原因。
    myisam不支持事务,因而在获取锁,进入下一步操作时,直接可以得到状态并返回,而不会形成相互等待。看看这个例子:
    会话1:
    mysql> create table t3(id int) engine=myisam;
    Query OK, 0 rows affected (0.03 sec)mysql> create table t4(id int) engine=myisam;
    Query OK, 0 rows affected (0.02 sec)mysql> lock tables t3 write;
    Query OK, 0 rows affected (0.00 sec)
    会话2:
    mysql> lock tables t4 write;
    Query OK, 0 rows affected (0.00 sec)mysql> insert into t3 values(2);
    ERROR 1100 (HY000): Table 't3' was not locked with LOCK TABLES
    mysql> insert into t3 values(3
        -> );
    ERROR 1100 (HY000): Table 't3' was not locked with LOCK TABLES紧接着会话1执行:
    mysql> lock tables t4 write;
    它会一直等会话2去释放t4表的写锁,如果它一直不unlock呢,它就一直等。然而只要你记得unlock,所有这些等待最终都会消失。
    需要明确说明的是,这里的等待只是单方面等待,而不会相互等待。与“死锁”有明显区别。
    紧接着会话2执行:
    mysql> lock tables t3 write;
    Query OK, 0 rows affected (0.00 sec)
    会话1中的lock tables t4 write;会马上成功返回。
      

  5.   

    有关锁机制的问题,可以详细参看:
    http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html
      

  6.   

    关键看死锁怎么理解如果等待不算死锁的话,确实myisam不存在死锁