在什么情况下使用InnoDB表解决?

    作者:课课家教育更新于: 2016-03-23 09:37:40

         为什么我们会选择MySQLInnoDB表,原因在在于InnoDB表是采用行级锁,所以一般处理事务和行锁我们都会直接采用InnoDB表来解决,那么具体是怎样操作的呢?

    在什么情况下使用InnoDB表解决?_数据库_InnoDB表_课课家

          20.3.8 什么时候使用表锁

      对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁。

      第一种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销。

      第二种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。

      当然,应用中这两种事务不能太多,否则,就应该考虑使用MyISAM表了。

      在InnoDB下,使用表锁要注意以下两点。

      (1)在用LOCKTABLES对InnoDB表加锁时要注意,要将AUTOCOMMIT设为0,否则MySQL不会给表加锁;事务结束前,不要用UNLOCKTABLES释放表锁,因为UNLOCKTABLES会隐含地提交事务;COMMIT或ROLLBACK并不能释放用LOCKTABLES加的表级锁,必须用UNLOCKTABLES释放表锁。正确的方式见如下语句:

      例如,如果需要写表t1并从表t读,可以按如下做:

      (2)使用LOCKTABLES虽然可以给InnoDB加表级锁,但必须说明的是,表锁不是由InnoDB存储引擎层管理的,而是由其上一层──MySQLServer负责的,仅当autocommit=0、innodb_table_locks=1(默认设置)时,InnoDB层才能知道MySQL加的表锁,MySQLServer也才能感知InnoDB加的行锁,这种情况下,InnoDB才能自动识别涉及表级锁的死锁;否则,InnoDB将无法自动检测并处理这种死锁。

课课家教育

未登录

1