Team/난감했던 이슈들

[ MYSQL ] 중복처리 - 포인트 지급이 중복되는 경우 ( 외부에서 호출이 강제로 여러번 )

HEON.D 2024. 12. 19. 15:24

1. SQL 쿼리 수정 (INSERT IGNORE 또는 REPLACE)

MySQL 또는 MariaDB를 사용하는 경우, INSERT IGNORE를 사용해 중복 삽입을 방지하거나, ON DUPLICATE KEY UPDATE를 사용해 업데이트 처리할 수 있습니다.

1-1. UNIQUE 제약 조건 추가

user_id와 invoice_id의 조합이 고유하도록 테이블에 UNIQUE 제약 조건을 설정합니다.

ALTER TABLE USER_POINT
ADD CONSTRAINT unique_user_invoice UNIQUE (user_id, invoice_id);​

 

 

1-2. INSERT IGNORE 사용

UNIQUE 제약 조건이 있는 상태에서 동일한 user_id와 invoice_id가 있을 경우 삽입을 무시합니다.

const decreasePoint = async (type, provider, point, content, userId, invoice_id) => {    
    const _sql = `
        INSERT IGNORE INTO USER_POINT (
            user_point_type,
            user_point_provider,
            user_point,
            user_point_content,
            user_id,
            point_id,
            invoice_id
        ) VALUES (
            '${type}',
            '${provider}',
            ${point},
            '${content}',
            ${userId},
            0,
            ${invoice_id});`;              
    const _res = await lib.services.queryService(_sql);
    return _res;
};