MySQL에 데이터를 삽입하면서 잠금 테이블을 작성하는 방법
객관적으로
사용자가 요청할 때(REST API) 복사하고 싶다N
테이블에서 레코드source
식탁에 올리다destination
.
현재의 솔루션
- 트랜잭션을 시작합니다.
- 테이블 잘라내기
destination
. - 테이블에 삽입
destination
에서 고르다.source
제한.N
(단일 쿼리). - 트랜잭션을 커밋합니다.
문제
N
범위 사이에 있을 수 있다100000
-2500000
사용자가 다음 명령어를 사용하여2개의 요구를 연속해서 했을 경우N
그때 기록하다2xN
레코드가 삽입되고 있습니다.
흐름의 예:
- [액션 - 1] 사용자가 복사 요청을 한다
100
기록. - [액션 - 1] 거래가 시작됩니다.
- [액션 - 2] 사용자가 복사 요청을 한다
200
기록. - [액션 - 1] 잘린 표
destination
. - [액션 - 2] 거래가 시작됩니다.
- [액션 - 2] 잘린 표
destination
. - [액션 - 1] 쿼리 삽입이 트리거되었습니다.(복사)
100
레코드) - [액션 - 2] 쿼리 삽입이 트리거되었습니다.(복사)
200
레코드) - [액션 - 1] 거래가 종료됩니다.
- [액션 - 2] 거래가 종료됩니다.
결과: 다음과 같은 것이 있습니다.300
레코드destination
테이블.
바람직한 솔루션
어느 시점에서도 1회만 삽입할 수 있도록 하고 싶습니다.
- 트랜잭션을 시작합니다.
- 잠그다
destination
테이블. - 잘라내다
destination
테이블. - 삽입처
destination
테이블. - 잠금 해제
destination
테이블. - 트랜잭션을 종료합니다.
행선지 테이블의 기입만을 실시하는 경우는, 기입 조작은 행해지지 않는 것에 주의해 주세요(단,
기타 상세
- 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
'programing' 카테고리의 다른 글
CTE를 사용하지 않고 SQL 쿼리에서 계층적 결과(pedigree)를 생성하는 방법 (0) | 2022.09.17 |
---|---|
테이블에 삽입하여 테이블에서 선택합니다. 여기서 열 이름 = xxx 및 열 이름 2 = yyy 루프가 너무 많습니다. (0) | 2022.09.17 |
리스트에서 최대값과 그 지수를 찾는 피톤식 방법? (0) | 2022.09.16 |
Python 'If not' 구문 (0) | 2022.09.16 |
노드의 속편을 사용하여 레코드를 업데이트하려면 어떻게 해야 합니까? (0) | 2022.09.16 |