>  기사  >  웹 프론트엔드  >  React Query에서 데이터베이스 쿼리에 대한 분산 잠금 구현

React Query에서 데이터베이스 쿼리에 대한 분산 잠금 구현

PHPz
PHPz원래의
2023-09-28 08:42:23989검색

在 React Query 中实现数据库查询的分布式锁定

React Query에서 데이터베이스 쿼리에 대한 분산 잠금 구현

소개:
최신 웹 애플리케이션에서는 백엔드 데이터베이스와 상호 작용해야 하는 경우가 많습니다. 여러 사용자가 동시에 데이터베이스에 액세스하여 동일한 데이터를 수정할 때 동시성 문제가 발생합니다. 동시성 문제를 방지하기 위해 분산 잠금이 일반적인 솔루션입니다. 이 글에서는 React Query에서 분산 잠금을 사용하여 데이터베이스 쿼리를 구현하는 방법을 소개합니다.

React Query는 React 애플리케이션에서 데이터를 쉽게 가져오고, 업데이트하고, 관리할 수 있게 해주는 강력한 데이터 관리 라이브러리입니다. 다양한 유형의 쿼리를 하나의 "쿼리"로 결합하여 필요에 따라 여러 쿼리 및 업데이트 작업을 쉽게 수행할 수 있도록 하는 "쿼리 참조"라는 개념을 사용합니다.

React Query에서 데이터베이스 쿼리의 분산 잠금을 구현하기 위해 사용자 정의 쿼리 후크와 데이터베이스의 낙관적 잠금 메커니즘을 사용할 수 있습니다.

1. 사용자 정의 쿼리 후크
먼저, 데이터베이스 쿼리 작업을 수행하기 위한 사용자 정의 쿼리 후크를 만들어야 합니다. 이 후크는 네트워크 요청 전송과 데이터 반환을 담당합니다.

import { useQuery } from 'react-query';
import axios from 'axios';

const useDatabaseQuery = (query) => {
  const fetchQuery = async () => {
    const response = await axios.get('/api/database', { params: { query } });
    return response.data;
  };

  return useQuery(query, fetchQuery);
};

export default useDatabaseQuery;

위 코드에서는 Axios 라이브러리를 사용하여 네트워크 요청을 보냈습니다. 백엔드 API 구성 및 데이터베이스 구성에 따라 적절하게 변경해야 합니다.

2. 쿼리 작업 병합
다음으로 React Query의 쿼리 참조 메커니즘을 사용하여 여러 쿼리 작업을 복합 쿼리로 병합할 수 있습니다. 이렇게 하면 여러 쿼리의 결과를 복합 쿼리에서 동시에 얻을 수 있습니다.

import { useQueries } from 'react-query';
import useDatabaseQuery from './useDatabaseQuery';

const useCombinedQueries = () => {
  const query1 = useDatabaseQuery('SELECT * FROM table1');
  const query2 = useDatabaseQuery('SELECT * FROM table2');
  const query3 = useDatabaseQuery('SELECT * FROM table3');

  return useQueries([query1, query2, query3]);
};

export default useCombinedQueries;

위 코드에서는 useDatabaseQuery 사용자 정의 쿼리 후크를 사용하여 세 개의 별도 쿼리를 생성했습니다. 그런 다음 이를 useQueries 함수에 넣어 모든 쿼리 작업을 한 번에 수행합니다. useDatabaseQuery自定义查询钩子来创建三个独立的查询。然后,我们将它们放入useQueries函数中,以便一次执行所有查询操作。

三、分布式锁定的实现
为了实现数据库查询的分布式锁定,我们可以利用数据库的乐观锁定机制。乐观锁定是一种乐观的并发控制策略,它允许多个用户同时读取同一数据,但只有一个用户能够修改并保存数据。

首先,在数据库表中添加一个额外的锁定字段,用于将特定的行标记为已锁定或未锁定。

-- 创建表
CREATE TABLE my_table (
  id SERIAL PRIMARY KEY,
  content TEXT,
  is_locked BOOLEAN DEFAULT FALSE
);

然后,在进行查询操作之前,我们需要获取并锁定相应的数据行。

import { useMutation, queryCache } from 'react-query';
import axios from 'axios';

const lockQuery = async (id) => {
  const response = await axios.post('/api/database/lock', { id });
  return response.data;
};

const unlockQuery = async (id) => {
  const response = await axios.post('/api/database/unlock', { id });
  return response.data;
};

const useLockQuery = (query) => {
  const mutation = useMutation(lockQuery);
  const unlockMutation = useMutation(unlockQuery);

  const lock = async (id) => {
    await mutation.mutateAsync(id);
    queryCache.invalidateQueries(query); // 清理缓存
  };

  const unlock = async (id) => {
    await unlockMutation.mutateAsync(id);
    queryCache.invalidateQueries(query); // 清理缓存
  };

  return { lock, unlock, isLocked: mutation.isLoading };
};

export default useLockQuery;

在上面的代码中,我们创建了两个异步的mutatation函数lockQueryunlockQuery,它们分别用于锁定和解锁特定的数据行。然后,我们使用useMutation函数来声明这两个mutation。

最后,我们在自定义查询钩子中引入useLockQuery钩子来获取数据并锁定特定的数据行。同时,在需要解锁数据行时,可以通过调用unlock函数来解锁数据行。

四、使用分布式锁定的查询
现在,我们可以在React组件中使用useCombinedQueries自定义查询钩子和useLockQuery钩子。

import useCombinedQueries from './useCombinedQueries';
import useLockQuery from './useLockQuery';

const MyComponent = () => {
  const combinedQueries = useCombinedQueries();
  const { lock, unlock, isLocked } = useLockQuery('SELECT * FROM my_table');

  const handleLockClick = (id) => {
    lock(id);
  };

  const handleUnlockClick = (id) => {
    unlock(id);
  };

  return (
    <div>
      {combinedQueries.map((query, index) => (
        <div key={index}>
          {query.isFetching ? (
            <p>Loading...</p>
          ) : query.error ? (
            <p>Error: {query.error.message}</p>
          ) : (
            <>
              <p>Data: {query.data}</p>
              <button onClick={() => handleLockClick(query.data.id)} disabled={isLocked}>Lock</button>
              <button onClick={() => handleUnlockClick(query.data.id)}>Unlock</button>
            </>
          )}
        </div>
      ))}
    </div>
  );
};

export default MyComponent;

在上面的代码中,我们使用了useCombinedQueries自定义查询钩子来获取数据库中的数据。然后,我们使用useLockQuery

3. 분산 잠금 구현

데이터베이스 쿼리에 대한 분산 잠금을 구현하기 위해 데이터베이스의 낙관적 잠금 메커니즘을 사용할 수 있습니다. 낙관적 잠금은 여러 사용자가 동시에 동일한 데이터를 읽을 수 있지만 한 명의 사용자만 데이터를 수정하고 저장할 수 있는 낙관적 동시성 제어 전략입니다.

먼저, 특정 행을 잠김 또는 잠금 해제로 표시하는 추가 잠금 필드를 데이터베이스 테이블에 추가하세요.

rrreee

그런 다음 쿼리 작업을 수행하기 전에 해당 데이터 행을 획득하고 잠가야 합니다. 🎜rrreee🎜위 코드에서는 특정 데이터 행을 각각 잠그고 잠금 해제하는 데 사용되는 두 개의 비동기 변형 함수 lockQueryunlockQuery를 만들었습니다. 그런 다음 useMutation 함수를 사용하여 이 두 변이를 선언합니다. 🎜🎜마지막으로 사용자 정의 쿼리 후크에 useLockQuery 후크를 도입하여 데이터를 얻고 특정 데이터 행을 잠급니다. 동시에 데이터 행의 잠금을 해제해야 하는 경우 unlock 함수를 호출하여 데이터 행의 잠금을 해제할 수 있습니다. 🎜🎜4. 분산 잠금을 사용한 쿼리🎜이제 React 구성 요소에서 useCombinedQueries 사용자 정의 쿼리 후크와 useLockQuery 후크를 사용할 수 있습니다. 🎜rrreee🎜위 코드에서는 useCombinedQueries 사용자 정의 쿼리 후크를 사용하여 데이터베이스의 데이터를 가져옵니다. 그런 다음 useLockQuery 후크를 사용하여 특정 데이터 행을 잠그거나 잠금 해제합니다. 마지막으로 쿼리 상태와 데이터 행의 잠금 여부에 따라 해당 UI를 표시합니다. 🎜🎜요약: 🎜React Query와 사용자 정의 쿼리 후크를 사용하면 데이터베이스 쿼리의 분산 잠금을 쉽게 구현할 수 있습니다. 이 방법은 낙관적 잠금 개념을 결합하여 데이터베이스에 동시에 액세스할 때 데이터 일관성과 동시성 제어를 보장합니다. 🎜🎜실제 사용에서는 특정 비즈니스 요구 사항 및 백엔드 API 구현에 따라 해당 수정 및 조정이 필요하다는 점에 유의해야 합니다. 이 문서에 제공된 코드 예제는 참조용으로만 제공됩니다. 🎜

위 내용은 React Query에서 데이터베이스 쿼리에 대한 분산 잠금 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.