MariaDB 데이터베이스에 대한 쿼리 동기화
고가용성을 고려할 때 여러 프로세스가 데이터베이스를 통해 통신/동기화되는 시스템을 설계합니다(MariaDB일 가능성이 가장 높지만 Postgre를 조사할 수 있습니다).SQL 및 MySQL 옵션).
확인된 요구사항 중 하나는 다른 프로세스가 동일한 작업을 동시에 수행하지 않고 프로세스가 데이터베이스에서 작업을 수행해야 한다는 것입니다.
구체적으로, 제가 염두에 두고 있는 경주 조건은 다음과 같습니다.
- 프로세스 A가 SQL 트랜잭션을 시작하고 실행합니다.
SELECT * FROM requests WHERE ReservedTS IS NULL ORDER BY CreatedTS LIMIT 100
.여기서ReservedTS
그리고.CreatedTS
이다DATETIME
작업 제출자 프로세스에 의해 작업이 생성되고 해당 작업 실행자 프로세스에 의해 예약된 시간을 저장하는 열입니다. - 프로세스 B는 트랜잭션을 시작하고 동일한 쿼리를 실행하며 동일한 결과 집합을 가져옵니다.
- 프로세스 A 실행
UPDATE requests WHERE id IN (<list of IDs selected above>) AND ReservedTS IS NULL SET ReservedTS=NOW()
- 프로세스 B는 동일한 쿼리를 실행합니다. 프로세스 B의 트랜잭션에는 데이터의 자체 스냅샷이 있기 때문입니다.
ReservedTS
프로세스 B에 null이 아닌 것으로 나타나므로 항목이 두 번 예약됩니다. - 프로세스 A는 트랜잭션을 커밋합니다.
- 프로세스 B는 트랜잭션을 커밋하여 프로세스 A의 값을 덮어씁니다.
위의 데이터 경쟁을 해결할 수 있도록 도와주시겠습니까?
전용 잠금을 사용하여 쉽게 이 작업을 수행할 수 있습니다.
단순화를 위해 테스트 표:
CREATE TABLE t1 (id int not null auto_increment primary key, reserved int);
INSERT INTO t1 VALUES (0,0), (1,0);
프로세스 A:
BEGIN
SELECT id, reserved from t1 where id=2 and reserved=0 FOR UPDATE;
UPDATE t1 SET reserved=1 WHERE id=2 and reserved=0;
COMMIT
프로세스 B가 트랜잭션 A가 완료되기 전에 동일한 항목을 업데이트하려고 하면 잠금이 해제될 때까지(또는 시간 초과가 발생할 때까지) 기다려야 합니다.
update t1 set reserved=1 where id=2 and reserved=0;
Query OK, 0 rows affected (12.04 sec)
Rows matched: 0 Changed: 0 Warnings: 0
보시다시피, 프로세스 B는 아무것도 업데이트하지 않았습니다.
언급URL : https://stackoverflow.com/questions/61317620/synchronization-of-queries-to-a-mariadb-database
'programing' 카테고리의 다른 글
클릭 이벤트에서 요소를 요소 외부에 숨기려면 어떻게 해야 합니까? (0) | 2023.09.01 |
---|---|
클래스 조각을 부풀리는 중 오류 발생 (0) | 2023.09.01 |
해시방 URL로 페이스북 공유/좋아요를 처리하는 방법은 무엇입니까? (0) | 2023.09.01 |
기본 키의 MySQL/MariaDB 느린 업데이트 (0) | 2023.09.01 |
이미지를 이미지 보기에 맞추고 가로 세로 비율을 유지한 다음 이미지 보기 크기를 이미지 크기에 맞게 조정하시겠습니까? (0) | 2023.09.01 |