๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/DB & SQL

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ DDL๊ณผ DML์„ ํ•จ๊ป˜ ์จ๋„ ๋ ๊นŒ?

by dkswnkk 2025. 5. 1.

๊ฐœ์š”

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด PostgreSQL์„ ์ œ์™ธํ•œ MySQL, MariaDB, Oracle์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ DDL์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ์ด์ „์— ์ˆ˜ํ–‰๋œ ๋ชจ๋“  DML์ด ์ž๋™์œผ๋กœ ์ปค๋ฐ‹๋˜์–ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ž‘์„ฑ์„ ์ง€์–‘ํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

START TRANSACTION;

-- DML
INSERT INTO test (id) VALUES (1);

-- DDL (PostgreSQL์„ ์ œ์™ธํ•œ DBMS์—์„œ๋Š” ์ด ์‹œ์ ์— ์•”๋ฌต์  COMMIT ๋ฐœ์ƒ)
CREATE TABLE test2 (id INT);

ROLLBACK; -- ๋กค๋ฐฑ์€ ์‹คํ–‰๋˜์ง€๋งŒ ์ด๋ฏธ ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ ์—†์Œ

๋ถ€๋„๋Ÿฝ์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๋™์•ˆ DDL์€ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ DDL์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ์ด์ „์˜ DML๊นŒ์ง€๋„ ์ž๋™์œผ๋กœ ์ปค๋ฐ‹๋œ๋‹ค๋Š” ์ ์€ ๋ชฐ๋ž๋‹ค. ๊ทธ๋ฆฌ๊ณ  MariaDB๋งŒ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ PostgreSQL์—์„œ๋Š” DDL์กฐ์ฐจ๋„ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋กค๋ฐฑ๋œ๋‹ค๋Š” ์ ๋„ ์ด๋ฒˆ์— ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

MySQL, MariaDB

MySQL(InnoDB ๊ธฐ์ค€)๊ณผ MariaDB๋Š” DDL ๋ฌธ์žฅ์„ ํŠธ๋žœ์žญ์…˜๊ณผ ์™„์ „ํžˆ ๋…๋ฆฝ๋œ ๋ณ„๋„ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ DDL์ด ์‹คํ–‰๋˜๊ธฐ ์ง์ „์— ํŠธ๋žœ์žญ์…˜ ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ–‰๋˜์—ˆ๋”๋ผ๋„ ๊ธฐ์กด์— ์ง„ํ–‰ ์ค‘์ด๋˜ ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ์•”๋ฌต์ ์œผ๋กœ ์ปค๋ฐ‹๋œ๋‹ค.

MySQL - https://dev.mysql.com/doc/refman/8.4/en/implicit-commit.html
MariaDB - https://mariadb.com/kb/en/sql-statements-that-cause-an-implicit-commit

์‹ฌ์ง€์–ด DDL๊ณผ DML์ด ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๋‹ค๋ฃจ๋”๋ผ๋„, ๊ทธ๋ฆฌ๊ณ  DDL์ด ์‹คํŒจํ•˜๋”๋ผ๋„ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์‹œ๋„ ์‹œ์ ์— ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ฆ‰ DDL๊ณผ DML์€ ํ•˜๋‚˜์˜ ์›์ž์  ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฌถ์ด์ง€ ์•Š๊ณ  ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

START TRANSACTION;

INSERT INTO test (id) VALUES (1);

-- TEMPORARY TABLE ์ƒ์„ฑ (์•”๋ฌต์  ์ปค๋ฐ‹ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ)
CREATE TEMPORARY TABLE temp_test (id INT);

ROLLBACK; -- ์œ„์˜ INSERT๊นŒ์ง€ ๋ชจ๋‘ ๋กค๋ฐฑ๋จ

๋‹ค๋งŒ ์œ„์™€ ๊ฐ™์ด CREATE TEMPORARY TABLE๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๋ช…๋ น์€ ์˜ˆ์™ธ์ ์œผ๋กœ ์•”๋ฌต์  ์ปค๋ฐ‹์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ ๋‚ด DML๊ณผ ํ•จ๊ป˜ ๋กค๋ฐฑ๋œ๋‹ค.

 

Oracle

Oracle ๋˜ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ DDL์„ ์‹คํ–‰ํ•˜๋ฉด ์ฆ‰์‹œ ์•”๋ฌต์  ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ MySQL, MariaDB์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ DDL๊ณผ DML์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฌถ์„ ์ˆ˜ ์—†๋‹ค.

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Types-of-SQL-Statements.html

 

PostgreSQL

PostgreSQL์€ ๋‹ค๋ฅธ RDBMS์™€ ๋‹ฌ๋ฆฌ ๋Œ€๋ถ€๋ถ„์˜ SQL ๋ฌธ์žฅ, ์‹ฌ์ง€์–ด DDL์กฐ์ฐจ๋„ ํŠธ๋žœ์žญ์…˜ ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ–‰ ์ค‘ ์ž๋™ ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋•๋ถ„์— DDL๋„ DML๊ณผ ํ•จ๊ป˜ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(๋‹จ, CREATE/DROP DATABASE, CREATE/DROP TABLESPACE, CLUSTER์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด๋‚˜ ๋ฌผ๋ฆฌ์  ์ €์žฅ์†Œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ช…๋ น์–ด๋Š” ํŠธ๋žœ์žญ์…˜ ๋ธ”๋ก ๋‚ด์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€)

MySQL๊ณผ ๋‹ฌ๋ฆฌ PostgreSQL์—์„œ ์ด๋Ÿฌํ•œ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” MVCC ์ ์šฉ ๋ฒ”์œ„์˜ ์ฐจ์ด ๋•Œ๋ฌธ์ด๋‹ค. MySQL(InnoDB)์€ MVCC๋ฅผ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์—๋งŒ ์ ์šฉํ•˜๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(ํ…Œ์ด๋ธ” ์ •์˜ ๋“ฑ)๋Š” ๋ณ„๋„๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋กค๋ฐฑํ•  ์ˆ˜ ์—†์ง€๋งŒ, PostgreSQL์€ ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ๊นŒ์ง€ ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์— MVCC ๋Œ€์ƒ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ DDL ๋ณ€๊ฒฝ๋„ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋‹ค.

https://www.postgresql.org/docs/current/catalogs.html#:~:text=The%20system%20catalogs%20are%20the,have%20been%20made%20available%20as

 

๋Œ“๊ธ€