programing

MySQL에 데이터를 삽입하면서 잠금 테이블을 작성하는 방법

yoursource 2022. 9. 17. 10:50
반응형

MySQL에 데이터를 삽입하면서 잠금 테이블을 작성하는 방법

객관적으로

사용자가 요청할 때(REST API) 복사하고 싶다N테이블에서 레코드source식탁에 올리다destination.

현재의 솔루션

  1. 트랜잭션을 시작합니다.
  2. 테이블 잘라내기destination.
  3. 테이블에 삽입destination에서 고르다.source제한.N(단일 쿼리).
  4. 트랜잭션을 커밋합니다.

문제

N범위 사이에 있을 수 있다100000-2500000사용자가 다음 명령어를 사용하여2개의 요구를 연속해서 했을 경우N그때 기록하다2xN레코드가 삽입되고 있습니다.

흐름의 예:

  1. [액션 - 1] 사용자가 복사 요청을 한다100기록.
  2. [액션 - 1] 거래가 시작됩니다.
  3. [액션 - 2] 사용자가 복사 요청을 한다200기록.
  4. [액션 - 1] 잘린 표destination.
  5. [액션 - 2] 거래가 시작됩니다.
  6. [액션 - 2] 잘린 표destination.
  7. [액션 - 1] 쿼리 삽입이 트리거되었습니다.(복사)100레코드)
  8. [액션 - 2] 쿼리 삽입이 트리거되었습니다.(복사)200레코드)
  9. [액션 - 1] 거래가 종료됩니다.
  10. [액션 - 2] 거래가 종료됩니다.

결과: 다음과 같은 것이 있습니다.300레코드destination테이블.

바람직한 솔루션

어느 시점에서도 1회만 삽입할 수 있도록 하고 싶습니다.

  1. 트랜잭션을 시작합니다.
  2. 잠그다destination테이블.
  3. 잘라내다destination테이블.
  4. 삽입처destination테이블.
  5. 잠금 해제destination테이블.
  6. 트랜잭션을 종료합니다.

행선지 테이블의 기입만을 실시하는 경우는, 기입 조작은 행해지지 않는 것에 주의해 주세요(단,

기타 상세

  • MySQL(데이터베이스)
  • NodeJS(REST API 서버)
  • 저장 프로시저 없음

임시 해결 방법

일시적으로 트랜잭션을 시작하기 전에 데이터베이스에 설정한 플래그를 사용하고 트랜잭션이 완료되면 플래그를 설정 해제합니다.플래그가 설정되는 동안 도착한 다른 요청은 메시지와 함께 종료됩니다(프로세스가 이미 실행 중입니다. 나중에 다시 시도하십시오).

이에 대한 더 나은 해결책을 찾을 수 있도록 도와주세요.더 자세한 정보가 필요하시면 말씀하세요.

감사합니다.

다음과 같이 아래 쿼리를 시도할 수 있습니다.

SET AUTOCOMMIT=0;
LOCK TABLES `staff` WRITE;

-- inserts start here
INSERT INTO `staff` VALUES 
(2,'Jon','Snow',4,NULL,'Jon.snow@gameofthroneshbo.com',2,1,'Jon',NULL,'2006-02-15 03:57:16'),
(2,'Jon','Stephens',4,NULL,'Jon.Stephens@sakilastaff.com',2,1,'Jon',NULL,'2006-02-15 03:57:16');
-- till here

UNLOCK TABLES;
COMMIT;

한 걸음 물러서서 목표가 무엇인지 설명해 주시겠습니까?한편, 이하에 도움이 되는 다른 실장이 있습니다.

CREATE TABLE new LIKE dest;
populate `new` from `source;
RENAME TABLE dest TO old, new TO dest;
DROP TABLE old;

주의:

  • 각 문이 atomic 이외에는 잠금 또는 트랜잭션은 없습니다.
  • 입력중dest잠금 문제 없이 임의로 오래 걸릴 수 있습니다.
  • dest항상 사용할 수 있습니다.단, 짧은 시간 동안만 사용 가능합니다.RENAME 「 」를 참조해 주세요.dest차단되어 있습니다.

이것은 원자적으로 최소한의 영향을 주면서 테이블을 새로고침하는 일반적인 방법입니다.

레코드를 삽입하는 동안 잠금-잠금 해제 시나리오를 수행하도록 SQL 쿼리를 최적화하면 어떨까요?

LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...

lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE

UNLOCK TABLES

상세정보 - https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html

언급URL : https://stackoverflow.com/questions/51146398/how-to-write-lock-table-while-inserting-data-in-mysql

반응형