MySQL 트랜잭션 및 데이터 무결성

MySQLBeginner
지금 연습하기

소개

이 랩에서는 MySQL 트랜잭션을 사용하여 데이터 무결성을 보장하는 방법을 배우게 됩니다. 트랜잭션은 일련의 SQL 작업을 단일한 "모두 성공하거나 모두 실패하는" 작업 단위로 그룹화합니다. 이는 모든 단계가 성공적으로 완료되어야 하는 금융 이체와 같은 작업에 필수적입니다.

BEGIN으로 트랜잭션을 시작하고, COMMIT으로 변경 사항을 영구적으로 적용하며, ROLLBACK으로 변경 사항을 취소하고, SAVEPOINT를 사용하여 부분적인 롤백을 수행하는 연습을 하게 됩니다. 이 랩이 끝나면 데이터베이스 작업을 안전하고 안정적으로 관리하는 방법을 이해하게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 95%입니다.학습자들로부터 90%의 긍정적인 리뷰율을 받았습니다.

데이터베이스 및 테이블 설정

트랜잭션을 사용하기 전에 데이터베이스와 테이블을 설정해야 합니다. 이 단계에서는 은행 운영을 시뮬레이션하기 위해 bank_db라는 데이터베이스와 accounts 테이블을 생성합니다.

먼저 데스크톱에서 터미널을 엽니다.

root 사용자로 MySQL 서버에 연결합니다. 이 랩 환경에서는 root 사용자에 대한 비밀번호가 필요하지 않습니다.

sudo mysql -u root

연결되면 MySQL 프롬프트 (mysql>) 가 표시되며, 이제 SQL 명령을 실행할 수 있음을 나타냅니다.

bank_db 데이터베이스를 생성하고 현재 세션에서 해당 데이터베이스를 사용하도록 전환합니다. IF NOT EXISTS 절은 데이터베이스가 이미 존재하는 경우 오류를 방지합니다.

CREATE DATABASE IF NOT EXISTS bank_db;
USE bank_db;

다음으로 accounts 테이블을 생성합니다. 이 테이블은 ID, 계좌 번호 및 잔액을 포함한 계좌 정보를 저장합니다.

CREATE TABLE accounts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    account_number VARCHAR(20) UNIQUE NOT NULL,
    balance DECIMAL(10, 2) NOT NULL
);

이제 accounts 테이블에 두 개의 샘플 계좌를 삽입합니다. 이 계좌들은 시작 데이터로 사용될 것입니다.

INSERT INTO accounts (account_number, balance) VALUES
('ACC001', 1000.00),
('ACC002', 500.00);

테이블과 데이터가 올바르게 생성되었는지 확인하려면 다음 쿼리를 실행합니다.

SELECT * FROM accounts;

방금 삽입한 두 개의 계좌가 표시되어야 합니다. 출력은 다음과 같습니다.

+----+----------------+---------+
| id | account_number | balance |
+----+----------------+---------+
|  1 | ACC001         | 1000.00 |
|  2 | ACC002         |  500.00 |
+----+----------------+---------+
2 rows in set (0.00 sec)

데이터베이스와 테이블이 준비되었으므로 트랜잭션에 대해 배울 준비가 되었습니다.

BEGINCOMMIT 을 사용한 성공적인 트랜잭션 생성

트랜잭션은 단일 논리적 단위로 수행되는 일련의 작업입니다. 변경 사항을 영구적으로 만들려면 COMMIT해야 합니다. 이 단계에서는 ACC001에서 ACC002로 성공적인 은행 이체를 시뮬레이션합니다.

이전 단계에서 사용했던 MySQL 셸에 아직 있어야 합니다.

먼저 BEGIN 명령을 사용하여 새 트랜잭션을 시작합니다. 이후의 모든 명령은 COMMIT 또는 ROLLBACK할 때까지 이 트랜잭션의 일부가 됩니다.

BEGIN;

이제 이체를 위한 두 가지 작업을 수행합니다. ACC001에서 100 달러를 차감하고 ACC002에 100 달러를 추가합니다.

UPDATE accounts SET balance = balance - 100.00 WHERE account_number = 'ACC001';
UPDATE accounts SET balance = balance + 100.00 WHERE account_number = 'ACC002';

이 시점에서 변경 사항은 현재 세션 내에서만 볼 수 있습니다. 계좌의 임시 상태를 확인할 수 있습니다.

SELECT * FROM accounts;

출력에는 업데이트된 잔액이 표시되지만 아직 영구적으로 저장되지는 않았습니다.

+----+----------------+---------+
| id | account_number | balance |
+----+----------------+---------+
|  1 | ACC001         |  900.00 |
|  2 | ACC002         |  600.00 |
+----+----------------+---------+
2 rows in set (0.00 sec)

두 작업 모두 성공했으므로 트랜잭션을 커밋하여 변경 사항을 영구적으로 만들 수 있습니다.

COMMIT;

COMMIT 명령은 트랜잭션 중에 발생한 모든 변경 사항을 저장합니다. 이체는 이제 완료되었으며 다른 모든 데이터베이스 연결에서 볼 수 있습니다. 테이블을 다시 쿼하여 이를 확인할 수 있습니다. 잔액은 900 달러와 600 달러로 유지됩니다.

ROLLBACK 으로 트랜잭션 되돌리기

때로는 트랜잭션 내의 작업이 실패하거나 취소하기로 결정할 수 있습니다. ROLLBACK 명령은 현재 트랜잭션 중에 수행된 모든 변경 사항을 폐기하고 트랜잭션 시작 전의 상태로 데이터베이스를 복원합니다.

새 계좌를 추가하기 위한 새 트랜잭션을 시작해 보겠습니다.

BEGIN;

이제 accounts 테이블에 새 계좌 ACC003을 삽입합니다.

INSERT INTO accounts (account_number, balance) VALUES ('ACC003', 150.00);

트랜잭션 내의 새 계좌를 보려면 테이블을 확인합니다.

SELECT * FROM accounts;

세 개의 계좌가 나열된 것을 볼 수 있습니다.

+----+----------------+---------+
| id | account_number | balance |
+----+----------------+---------+
|  1 | ACC001         |  900.00 |
|  2 | ACC002         |  600.00 |
|  3 | ACC003         |  150.00 |
+----+----------------+---------+
3 rows in set (0.00 sec)

이제 이 계좌가 추가되지 않았어야 함을 깨달았다고 가정해 보겠습니다. 커밋하는 대신 ROLLBACK을 사용하여 전체 트랜잭션을 취소할 수 있습니다.

ROLLBACK;

이 명령은 INSERT 작업을 실행 취소합니다. 이를 확인하려면 accounts 테이블을 다시 쿼합니다.

SELECT * FROM accounts;

ACC003 계좌가 사라지고 테이블은 BEGIN을 입력하기 전의 상태로 돌아갔습니다.

+----+----------------+---------+
| id | account_number | balance |
+----+----------------+---------+
|  1 | ACC001         |  900.00 |
|  2 | ACC002         |  600.00 |
+----+----------------+---------+
2 rows in set (0.00 sec)

ROLLBACK은 오류가 발생했을 때 데이터 무결성을 유지하는 데 중요한 도구입니다.

SAVEPOINT 을 사용한 부분 롤백

긴 트랜잭션의 경우 전체 트랜잭션을 취소하는 대신 작업의 일부만 되돌리고 싶을 수 있습니다. SAVEPOINT를 사용하면 트랜잭션 내에 나중에 롤백할 수 있는 마커를 설정할 수 있습니다.

새 트랜잭션을 시작해 보겠습니다.

BEGIN;

먼저 ACC001의 잔액을 업데이트하여 50 달러를 증가시킵니다.

UPDATE accounts SET balance = balance + 50.00 WHERE account_number = 'ACC001';

이제 세이브포인트를 생성합니다. 이는 트랜잭션의 현재 상태에 대한 북마크 역할을 합니다.

SAVEPOINT after_update;

다음으로 다른 작업을 수행합니다. 새 계좌 ACC004를 삽입합니다.

INSERT INTO accounts (account_number, balance) VALUES ('ACC004', 300.00);

ACC004 삽입이 실수였지만 ACC001에 대한 업데이트는 올바르게 되었다고 가정해 보겠습니다. 세이브포인트로 롤백하여 INSERT 문만 되돌릴 수 있습니다.

ROLLBACK TO after_update;

이 명령은 트랜잭션을 after_update 세이브포인트를 생성했을 때의 상태로 되돌립니다. ACC004의 삽입은 취소되지만 ACC001에 대한 업데이트는 유지됩니다.

확인하기 위해 테이블을 쿼합니다. ACC004는 사라져야 하지만 ACC001의 잔액은 업데이트되어야 합니다.

SELECT * FROM accounts;

출력에는 잔액이 950.00 달러인 ACC001이 표시되고 ACC004는 표시되지 않아야 합니다.

+----+----------------+---------+
| id | account_number | balance |
+----+----------------+---------+
|  1 | ACC001         |  950.00 |
|  2 | ACC002         |  600.00 |
+----+----------------+---------+
2 rows in set (0.00 sec)

ACC001에 대한 업데이트를 유지하고 싶으므로 이제 트랜잭션의 나머지 부분을 커밋할 수 있습니다.

COMMIT;

세이브포인트를 사용하여 부분 롤백을 성공적으로 수행했습니다. 이제 MySQL 셸을 종료할 수 있습니다.

exit;

요약

이 실습에서는 데이터 무결성을 유지하기 위한 MySQL 트랜잭션의 기본 사항을 배웠습니다. BEGIN으로 트랜잭션을 시작하여 COMMIT으로 완료하거나 ROLLBACK으로 취소하는 완전한 트랜잭션 수명 주기를 실습했습니다.

은행 송금을 성공적으로 시뮬레이션하여 여러 작업이 단일 원자 단위로 처리되도록 했습니다. 또한 부분 롤백을 가능하게 하여 SAVEPOINT를 사용하여 복잡한 트랜잭션을 더 세밀하게 제어하는 방법을 배웠습니다. 이러한 기술은 데이터 일관성이 가장 중요한 강력하고 안정적인 데이터베이스 애플리케이션을 개발하는 데 필수적입니다.