2

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

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

4

2 回答 2

4

LOCK_MODE 0 表示没有锁定。使用 MVCC 时使用此模式没有意义。

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

于 2012-11-27T05:03:19.963 回答
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 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不返回任何记录。
于 2012-11-26T15:25:46.250 回答