“超时试图锁定表”改变一个表

时间:2012-11-26 14:47:23

标签: h2

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

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)。

2 个答案:

答案 0 :(得分:4)

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

根据我的测试,如果将LOCK_MODE设置为1,则不会发生这种情况。

答案 1 :(得分:0)

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

  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:ALTER TABLE FOO ADD COLUMN NAME VARCHAR(200)
  4. 另一方面,将其更改为插入2001记录足以触发HYT00/50200错误。 表本身不需要是复杂的。下表也复制了这样的错误:CREATE TABLE FOO (ID BIGINT NOT NULL, CODE INTEGER NOT NULL)

    我会尝试详细了解...

    关于它的几个细节:

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