SHOW ENGINES;
위와 같이 명령어를 입력하면 database의 엔진을 확인할 수 있습니다. 현재 사용하고 있는 dbms는 mariadb입니다.
| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| InnoDB | DEFAULT | Supports transactions | YES | YES | YES |
| MyISAM | YES | Non-transactional engine | NO | NO | NO |
| MEMORY | YES | Stored in memory | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
YES, NO, DEFAULT).| 특징 | InnoDB | MyISAM |
|---|---|---|
| 트랜잭션 지원 | 지원함 (ACID 준수) | 지원하지 않음 |
| 외래 키 | 지원함 | 지원하지 않음 |
| 잠금 방식 | 행 수준 잠금 (Row-level locking) | 테이블 수준 잠금 (Table-level locking) |
| 데이터 복구 (Crash Recovery) | 자동 복구 기능 제공 | 자동 복구 기능 없음 |
| 성능 | 다중 사용자 환경에서 뛰어난 동시성 제공 | 읽기 작업(SELECT)에서 더 빠른 성능 |
| 디스크 공간 사용량 | 복잡한 구조로 인해 더 많은 디스크 공간 사용 | 단순한 구조로 인해 디스크 공간을 효율적으로 사용 |
| 전체 텍스트 검색 | 지원하지 않음 | 지원함 (Full-Text Search Index 사용 가능) |
| 데이터 저장 방식 | 데이터를 클러스터된 인덱스에 저장 (Clustered Index) | 데이터를 독립적으로 저장 |
| 락 경합 | 여러 트랜잭션에서 적은 경합 발생 | 다중 쓰기 작업 시 경합 발생 |
| ACID 특성 | 지원 (Atomicity, Consistency, Isolation, Durability) | 지원하지 않음 |
COMMIT, ROLLBACK 등을 통해 작업을 원자적으로 관리할 수 있습니다.CREATE TABLE test_innodb (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=InnoDB;
CREATE TABLE test_myisam (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=MyISAM;
SHOW VARIABLES LIKE 'default_storage_engine';
SELECT TABLE_NAME, ENGINE
FROM information_schema.tables
WHERE table_schema = 'sample';
MYSQL의 경우, TCL 명령어는 auto commit을 제공합니다.
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 실수로 에러가 발생한 경우
ROLLBACK;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
ROLLBACK TO sp1; -- sp1으로 롤백
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION: 트랜잭션 시작.COMMIT 또는 ROLLBACK: 성공 시 COMMIT, 실패 시 ROLLBACK.START TRANSACTIONSAVEPOINTROLLBACK TO SAVEPOINTCOMMIT 또는 ROLLBACK트랜잭션 간 간섭을 방지하기 위한 격리 수준을 설정합니다.
| 격리 수준 | 설명 | 읽기 현상 |
|---|---|---|
| READ UNCOMMITTED | 커밋되지 않은 데이터를 읽을 수 있음. (Dirty Read 가능) | Dirty Read, Non-repeatable Read, Phantom Read |
| READ COMMITTED | 커밋된 데이터만 읽을 수 있음. (Non-repeatable Read 가능) | Non-repeatable Read, Phantom Read |
| REPEATABLE READ | 동일 트랜잭션 내에서는 동일 데이터만 읽음. (Phantom Read 가능) | Phantom Read |
| SERIALIZABLE | 트랜잭션을 순차적으로 실행하여 완벽한 격리 보장. (가장 느리지만 완벽한 일관성 제공) | 없음 |
START TRANSACTION;
-- 데이터 변경
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 101, 1);
-- 트랜잭션 저장
COMMIT;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- sp1으로 롤백
ROLLBACK TO sp1;
COMMIT;
트랜잭션 간 데이터 충돌이 발생하거나 읽기 오류가 나타날 수 있습니다.SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 배타 락
CREATE, DROP, ALTER 등)는 자동으로 COMMIT을 발생시킵니다.START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- DDL 실행 (자동 COMMIT 발생)
CREATE TABLE new_table (id INT);
-- 이후 트랜잭션은 유효하지 않음
ROLLBACK; -- 아무 효과 없음
COMMIT하거나 ROLLBACK한 후에 DDL 실행.autocommit 설정에 따라 트랜잭션 동작이 달라질 수 있습니다.START TRANSACTION을 명시적으로 호출하지 않으면 각 쿼리가 자동으로 커밋됩니다.-- 자동 커밋 상태 확인
SELECT @@autocommit;
-- 자동 커밋 비활성화
SET autocommit = 0;
트랜잭션이 짧고 간결하게 유지되도록 설계.
잠금 대상을 최소화:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 특정 행 잠금
Deadlock 감지 및 회피:
redo log)가 가득 차면 성능 저하 발생.SHOW VARIABLES LIKE 'innodb_log_file_size';
SET GLOBAL innodb_log_file_size = 256M;
graph TD
A[Service Layer] --> B[Persistence Layer]
B --> C["Data Access Object (DAO)"]
C --> D[Database Connection Pool]
D --> E[Database]
E --> D
D --> C
C --> B
B --> A