2012-08-17 2 views
0

내 문제는 트랜잭션의 초기에 실행 된 선택에 따라 계산 된 값을 가진 새 행을 삽입하려고한다는 것입니다. 그러나 병렬 트랜잭션은 동일한 계산 된 값을 삽입하지 마십시오.MySQL에서 PostgreSQL과 같이 테이블 잠그기

이 문제는 트랜잭션 격리 수준 SERIALIZABLE을 통해 피해야합니다. 그러나 그렇지 않습니다.

  1. TRANSACTION의 A : :

    나는 다음 단계를 실행 BEGIN;

  2. TRANSACTION B : BEGIN;
  3. TRANSACTION A : tableName에서 max (x)를 선택하십시오.
  4. TRANSACTION B : tableName에서 max (x)를 선택하십시오.
  5. TRANSACTION B : tableName (x, PK_COLUMN) 값에 삽입 (최대 +1, primaryKeyA);
  6. TRANSACTION A : tableName (x, PK_COLUMN) 값에 삽입 (최대 +1, primaryKeyB);
  7. TRANSACTION A : COMMIT;
  8. TRANSACTION B : COMMIT;

그런 다음 MySQL에서 같은 x 값을 가진 두 개의 새 행이 있지만 두 트랜잭션 중 하나가 중단됩니다.

PostgreSQL에서 나는 LOCK TABLE tableName IN SHARE MODE을 수행 할 수 있습니다. 그러면 트랜잭션 A가 6 단계를 수행하지 못하게됩니다. MySQL에서는 http://dev.mysql.com/doc/refman/5.1/de/lock-tables.html에 설명 된 잠금 기술을 성공하지 못했습니다.

제안 사항? 감사.

답변

0

문제점을 발견했습니다. MySQL Workbench는 각 SQL 창에 대해 새 트랜잭션을 포크하지 않으므로 .... 유일한 트랜잭션으로 작업하고 있습니다. 서버에 연결하는 두 개의 터미널을 사용한 후. 모든 것이 예상대로 작동했습니다.