2

テーブルを変更しようとすると、次の応答がありました。

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

H2 URL: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 コンソールから入力されます。これは使用される唯一の接続です。
  • select onINFORMATION_SCHEMA.LOCKSはレコードを返しません。
于 2012-11-26T15:25:46.250 に答える