一、在InnoDB情况下什么时候使用表锁。
对于InnoDB表,大多数情况都应该使用行锁,因为事务和行锁往往是我们选择InnoDB表的重要原因。但在特殊的情况下,也可以使用表级锁。
(1)、事务需要更新大部分数据或者全部数据,表又比较大,如果使用默认的行级锁,不仅使得事务执行比较慢效率低,而且可能造成其他事务长时间锁等待和锁冲突,这样的情况可以考虑使用表级锁来提高执行效率。
(2)、事务涉及多个表,又比较复杂,很可能引起死锁,造成大量事务回滚,可以考虑一次性获取事务涉及的所有表,从而避免死锁,减少数据库因事务回滚产生的开销。
当然了,应用中这样的情况不能太多,否则可以考虑换成MyISAM表了,在InnoDB下使用表级锁应该注意以下两点。
二、死锁问题。
对于MyISAM表是不会产生死锁的,因为表锁总是一次性获取所有SQL语句涉及到的所有表级锁。但是在InnoDB表中,除了单个SQL语句组成的事务外,不然锁都是逐步获取的。这就让InnoDB表产生死锁的可能。如下是发生死锁的栗子。