내 문제는 트랜잭션의 초기에 실행 된 선택에 따라 계산 된 값을 가진 새 행을 삽입하려고한다는 것입니다. 그러나 병렬 트랜잭션은 동일한 계산 된 값을 삽입하지 마십시오.MySQL에서 PostgreSQL과 같이 테이블 잠그기
이 문제는 트랜잭션 격리 수준 SERIALIZABLE을 통해 피해야합니다. 그러나 그렇지 않습니다.
- TRANSACTION의 A : :
나는 다음 단계를 실행 BEGIN;
- TRANSACTION B : BEGIN;
- TRANSACTION A : tableName에서 max (x)를 선택하십시오.
- TRANSACTION B : tableName에서 max (x)를 선택하십시오.
- TRANSACTION B : tableName (x, PK_COLUMN) 값에 삽입 (최대 +1, primaryKeyA);
- TRANSACTION A : tableName (x, PK_COLUMN) 값에 삽입 (최대 +1, primaryKeyB);
- TRANSACTION A : COMMIT;
- 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에 설명 된 잠금 기술을 성공하지 못했습니다.
제안 사항? 감사.