写点什么

软件测试 | 什么时候使用表锁

  • 2023-08-01
    北京
  • 本文字数:700 字

    阅读完需:约 2 分钟

更多学习资料戳!!!

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

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

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

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

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

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

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

例如,如果需要写表t1并从表t读,可以按照如下做:SET AUTOCOMMIT=0;LOCK TABLES t1 WRITE,t2 READ,....;[do something with table t1 and t2 here];COMMIT;UNLOCK TABLES;
复制代码


用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | 什么时候使用表锁_测吧(北京)科技有限公司_InfoQ写作社区