【问题标题】:"Timeout trying to lock table" altering a table“尝试锁定表超时”更改表
【发布时间】:2012-11-14 01:39:18
【问题描述】:

当我尝试更改表时,得到以下响应:

Timeout trying to lock table ; SQL statement:
ALTER TABLE FOO ADD COLUMN NAME VARCHAR(200) [50200-169] HYT00/50200 (Help)

H2 网址:jdbc:h2:file:C:\h2\test;WRITE_DELAY=300;MVCC=TRUE;LOCK_MODE=0;FILE_LOCK=SOCKET

运行以下命令:

CREATE TABLE FOO (ID BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, CODE INTEGER NOT NULL)
@LOOP 6000 INSERT INTO FOO (CODE) VALUES (1)
ALTER TABLE FOO ADD COLUMN NAME VARCHAR(200) <== Here the problem happens

我的 H2 版本是 H2 1.3.169 (2012-09-09)。

【问题讨论】:

  • 尝试包含更多细节;这不是很具体。

标签: h2


【解决方案1】:

LOCK_MODE 0 means no locking.在使用MVCC时使用这种模式没有意义。

根据我的测试,如果你将 LOCK_MODE 设置为 1,它就不会发生。

【讨论】:

    【解决方案2】:

    看起来像一个错误......有趣的是,当我使用的记录少于问题中提到的记录时,提到的错误不会出现......例如,以下序列有效:

    1. 创建表:CREATE TABLE FOO (ID BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, CODE INTEGER NOT NULL)
    2. 插入一堆记录:@LOOP 2000 INSERT INTO FOO (CODE) VALUES (1)
    3. 执行变更表:ALTER TABLE FOO ADD COLUMN NAME VARCHAR(200)

    另一方面,将其更改为插入 2001 条记录足以触发 HYT00/50200 错误。 表本身不需要很复杂。下表也重现了此类错误:CREATE TABLE FOO (ID BIGINT NOT NULL, CODE INTEGER NOT NULL)

    我会尝试获取更多详细信息...

    关于它的一些细节:

    • H2 错误表示锁定,但所有命令均通过 H2 Web 控制台输入,这是唯一使用的连接。
    • INFORMATION_SCHEMA.LOCKS 上的选择不返回任何记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 2011-05-08
      • 2018-03-26
      • 2011-05-17
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多