programing

MariaDB 데이터베이스에 대한 쿼리 동기화

newstyles 2023. 9. 1. 20:38

MariaDB 데이터베이스에 대한 쿼리 동기화

고가용성을 고려할 때 여러 프로세스가 데이터베이스를 통해 통신/동기화되는 시스템을 설계합니다(MariaDB일 가능성이 가장 높지만 Postgre를 조사할 수 있습니다).SQL 및 MySQL 옵션).

확인된 요구사항 중 하나는 다른 프로세스가 동일한 작업을 동시에 수행하지 않고 프로세스가 데이터베이스에서 작업을 수행해야 한다는 것입니다.

구체적으로, 제가 염두에 두고 있는 경주 조건은 다음과 같습니다.

  1. 프로세스 A가 SQL 트랜잭션을 시작하고 실행합니다.SELECT * FROM requests WHERE ReservedTS IS NULL ORDER BY CreatedTS LIMIT 100.여기서ReservedTS그리고.CreatedTS이다DATETIME작업 제출자 프로세스에 의해 작업이 생성되고 해당 작업 실행자 프로세스에 의해 예약된 시간을 저장하는 열입니다.
  2. 프로세스 B는 트랜잭션을 시작하고 동일한 쿼리를 실행하며 동일한 결과 집합을 가져옵니다.
  3. 프로세스 A 실행UPDATE requests WHERE id IN (<list of IDs selected above>) AND ReservedTS IS NULL SET ReservedTS=NOW()
  4. 프로세스 B는 동일한 쿼리를 실행합니다. 프로세스 B의 트랜잭션에는 데이터의 자체 스냅샷이 있기 때문입니다.ReservedTS프로세스 B에 null이 아닌 것으로 나타나므로 항목이 두 번 예약됩니다.
  5. 프로세스 A는 트랜잭션을 커밋합니다.
  6. 프로세스 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