Database

[MSSQL] MSSQL과 MySQL의 트랜잭션, 프로시저, 트리거 기능 차이

JINJINC 2025. 5. 26. 18:19
728x90
반응형

MSSQL과 MySQL의 고급 문법 및 기능 차이


트랜잭션 및 잠금

트랜잭션은 데이터 무결성을 보장하기 위해 중요한 기능입니다. MSSQL과 MySQL 모두 트랜잭션을 지원하지만, 기본 설정과 동작 방식에 차이가 있습니다.

  • MSSQL
    • 기본적으로 수동 커밋 모드.
    • BEGIN TRAN, COMMIT, ROLLBACK을 사용하여 명시적으로 트랜잭션 처리.
    • WITH (NOLOCK) 힌트를 통해 읽기 잠금 우회 가능.
    • 격리 수준은 SET TRANSACTION ISOLATION LEVEL로 설정 가능.
  • MySQL
    • 기본적으로 자동 커밋 모드.
    • START TRANSACTION, COMMIT, ROLLBACK을 사용.
    • InnoDB 엔진에서만 트랜잭션 및 잠금 지원.
    • LOCK IN SHARE MODE, FOR UPDATE를 통해 명시적 잠금 제어 가능.
-- MSSQL
BEGIN TRAN
UPDATE Accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

-- MySQL
START TRANSACTION;
UPDATE Accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

저장 프로시저 및 함수

저장 프로시저는 SQL 문을 캡슐화하여 재사용 가능한 코드로 만드는 방법이며, UDF(사용자 정의 함수)도 지원됩니다.

  • MSSQL
    • 매개변수는 @ 기호 사용.
    • AS BEGIN ... END 구조 사용.
    • 트랜잭션, 조건문, 예외 처리 (TRY...CATCH) 포함 가능.
  • MySQL
    • IN, OUT, INOUT 파라미터 구분.
    • 여러 문장을 포함하려면 DELIMITER 설정 필요.
    • UDF는 단일 값만 반환, 부작용 있는 작업은 제한.
-- MSSQL
CREATE PROCEDURE GetUserById @id INT
AS
BEGIN
  SELECT * FROM Users WHERE id = @id;
END

-- MySQL
DELIMITER //
CREATE PROCEDURE GetUserById(IN userId INT)
BEGIN
  SELECT * FROM Users WHERE id = userId;
END //
DELIMITER ;

트리거와 이벤트

트리거는 테이블에 대한 DML 이벤트(INSERT, UPDATE, DELETE)에 반응하여 자동으로 실행되는 SQL 코드입니다. 이벤트는 시간 기반으로 실행되는 스케줄 작업입니다.

  • MSSQL
    • AFTER, INSTEAD OF 트리거 지원.
    • 복잡한 트리거 로직도 BEGIN...END 블록으로 구성 가능.
    • 시간 기반 자동 실행은 SQL Server Agent에서 관리.
  • MySQL
    • BEFORE, AFTER 트리거만 지원.
    • 테이블 단위로만 설정 가능.
    • 내장 EVENT SCHEDULER로 주기적인 작업 실행 가능 (예: 매일 로그 정리).
    • SET GLOBAL event_scheduler = ON; 설정 필요.
-- MySQL 이벤트 예시
CREATE EVENT ev_clear_logs
ON SCHEDULE EVERY 1 DAY
DO
  DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;

이러한 기능 차이는 단순한 문법을 넘어, 실제 시스템의 트랜잭션 안정성, 작업 자동화, 유지보수 측면에 큰 영향을 미칩니다.

실무에서는 각 DBMS의 특징을 잘 파악하여 기능을 적절히 활용하는 것이 중요합니다.

728x90
반응형