ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 有时select * from table_name语句不能完成, 一直挂起。 为什麽会出现这种情况? 该

有时select * from table_name语句不能完成, 一直挂起。 为什麽会出现这种情况? 该

原创 Linux操作系统 作者:bpmfhu 时间:2019-03-27 21:27:06 0 删除 编辑
一点经验

  对于没有索引的表, 所有的SQL操作几乎都要执行表的遍历。 在更新操作遍历此表时, 当查到要被更新的纪录时, 会对此记录加入X锁, 在缺省情况下, 因为使用CS隔离级别, 所以, 也只有此记录被加上X锁。 当进程B读取表中的信息时, 因为也需要遍历此表, 并且读取需要在记录上加上S锁。 在读取到被进程A加了X锁的纪录时, 由于XS是不兼容的锁, 所以S锁不能成功的加到纪录上, 读取操作不能成功, 需要等待进程A释放X锁。 这就是为什麽会出现B进程挂起等待的原因。

要解决此问题, 可以在相应的表中创建索引。 当有索引建立时, SQL操作不再需要遍历整个表(没有Where子句的SQL语句除外), 而是只需要根据索引键值来找到匹配的纪录。 当进程A和进程BWhere条件不同时, 这两个进程扫描的表中的纪录的范围不同, 也就不会出现上面提到的锁等待的情况。 当两个进程的Where条件相同时, 进程B还会等待, 因为又有进程B需要的纪录被进程A锁住。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4096/viewspace-52411/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2001-12-26

  • 博文量
    92
  • 访问量
    67141