2012-11-26 3 views
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)입니다.

+0

자세한 내용을 포함 시키십시오. 그것은별로 구체적이지 않습니다. –

답변

0

그건 재미 내가 예를 들어 ... 질문에 언급보다 적은 기록을 사용할 때 언급 한 오류가 표시되지 않는다는 것입니다 ... 버그처럼 보이는, 다음과 같은 순서로 작동 :

  1. 이 만들기 테이블 : CREATE TABLE FOO (ID BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, CODE INTEGER NOT NULL)
  2. 레코드의 무리 삽입 : 다른 시간에 ALTER TABLE FOO ADD COLUMN NAME VARCHAR(200)

: @LOOP 2000 INSERT INTO FOO (CODE) VALUES (1)

  • 을 테이블 변경을 실행 그리고 2001 레코드를 삽입하도록 변경하면 HYT00/50200 오류가 발생하기에 충분합니다. 테이블 자체는 복잡한 테이블 일 필요는 없습니다. 이러한 오류는 물론 테이블을 다음과 같이 재현 : CREATE TABLE FOO (ID BIGINT NOT NULL, CODE INTEGER NOT NULL)

    거 야 시도가에 대한 자세한 정보를 얻을 수 ...

    거의 그것에 대해 세부 정보 :

    • H2 오류가 나타내는 잠금하지만 모든 명령 H2 Web Console을 통해 입력됩니다. 이것은 유일하게 사용되는 연결입니다.
    • INFORMATION_SCHEMA.LOCKS에서 선택하면 레코드가 반환되지 않습니다.
  • 4

    LOCK_MODE 0 means no locking. MVCC를 사용할 때이 모드를 사용하는 것이 이치에 맞지 않습니다.

    내 테스트에 따르면 LOCK_MODE를 1로 설정하면 발생하지 않습니다.

    관련 문제