source

커밋되지 않은 트랜잭션이 특정 고유 키를 SQL에 삽입하려고 하는지 확인하는 방법

nicesource 2022. 10. 15. 08:31
반응형

커밋되지 않은 트랜잭션이 특정 고유 키를 SQL에 삽입하려고 하는지 확인하는 방법

MariaDB-Server에 데이터를 삽입하여 여러 사람이 동시에 사용할 수 있는 프로그램을 작성 중입니다.트랜잭션에 시간이 걸리기 때문에 다음과 같은 문제가 발생할 수 있습니다.개인 A는 기본 키 "c"로 트랜잭션을 시작하고 트랜잭션이 아직 커밋되지 않은 동안 개인 B는 동일한 기본 키 "c"로 데이터를 삽입하려고 합니다.B가 커밋되지 않은 트랜잭션에서 이미 사용하고 있는 프라이머리 키를 사용하여 트랜잭션을 시작하는 것을 어떻게 방지할 수 있습니까?

저는 MariaDB를 데이터베이스로, InnoDB를 엔진으로 사용하고 있습니다.

격리 레벨을 확인했지만 문제를 해결하는 방법을 찾을 수 없었습니다.

감사합니다!

트랜잭션 분리 수준과는 관련이 없습니다.자물쇠에 관한 거야

인덱스의 특정 항목을 삽입/업데이트/삭제하면 해당 항목이 잠깁니다.자물쇠는 선착순이다.동일한 인덱스 항목에 삽입/업데이트/삭제를 시도하는 다음 세션은 차단됩니다.

직접 시연할 수 있습니다.두 개의 MySQL 클라이언트 창을 나란히 엽니다.

첫 번째 창:

mysql> START TRANSACTION;
mysql> INSERT INTO mytable SET c = 42;

그럼 아직 약속하지 마세요.

두 번째 창:

mysql> INSERT INTO mytable SET c = 42;

이 시점에서 행업하여 잠금을 기다리는 것에 주의해 주세요.

첫 번째 창:

mysql> commit;

두 번째 창이 마침내 반환됨:

ERROR 1062 (23000): Duplicate entry '42' for key 'PRIMARY'

모든 테이블에는PRIMARY KEYMySQL에서는PRIMARY KEY정의상,UNIQUE.

또,UNIQUE테이블 위에 선언된 키입니다.

트랜잭션의 마크를 해제하려면 각 연결이 다음을 수행해야 합니다.

BEGIN;
various SQL statements
COMMIT;

이러한 SQL 문 중 하나가 행을 삽입할 경우 다른 사람이 해당 테이블에 동일한 고유 값을 삽입하지 못하도록 차단하기 위해 고유 키를 사용합니다.이로 인해 데드록(트랜잭션에 치명적), "잠금 대기 시간 초과" 등의 오류가 발생합니다.

주의: 있는 경우SELECTs이 거래에서, 당신은 계속해야 할 수도 있다.FOR UPDATE끝부분에서요.는 트랜잭션에서 변경할 수 있는 행을 나타내므로 다른 연결에 방해가 되지 않도록 경고합니다.

이런 일이 벌어지고 있는지 알아낼 수 있겠니?사실 그렇지 않아요.하지만 왜 신경써?그냥 앞으로 나아가서 당신이 해야 할 일을 하세요.그러나 다른 연결로 인해 오류가 발생하지 않았는지 확인하십시오.

"낙관적인" 코드라고 생각해 보세요.

격리 레벨은 그대로 두십시오.일반 태스크에 혼란을 가중시킬 뿐입니다.

기본 키는 행의 고유성을 보장하는 내부 값이며 외부 세계에 노출되는 것을 의미하지 않습니다.

를 사용하여 합니다.IDENTITY 를 사용합니다.SEQUENCE값을 합니다. 여러 개의 동시 삽입을 적절하게 처리하고 각각 다른 값을 할당합니다.

ID 사용:

CREATE TABLE house (
  id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  address VARCHAR(40) NOT NULL
);

INSERT INTO house (address) VALUES ('123 Maple Street');

시퀀스 사용:

CREATE SEQUENCE myseq1;

CREATE TABLE house (
  id INTEGER NOT NULL PRIMARY KEY,
  address VARCHAR(40) NOT NULL
);

INSERT INTO house (id, address) VALUES (NEXT VALUE FOR myseq1, '123 Maple Street');

언급URL : https://stackoverflow.com/questions/57638291/how-to-know-if-an-uncommitted-transaction-tries-to-insert-a-specific-unique-key

반응형