mysql 데이터베이스 트랜잭션의 개념과 특징, MySQL에서 트랜잭션을 실행하는 구문과 과정

데이터베이스 트랜잭션 개념 및 특징

데이터베이스 트랜잭션 은 메커니즘이자 작업 순서이며 일련의 데이터베이스 작업 명령을 포함합니다. 트랜잭션은 모든 명령 전체와 함께 시스템에 작업 요청을 제출하거나 취소합니다. 즉, 이 데이터베이스 명령 집합은 실행되거나 실행되지 않으므로 트랜잭션은 분할할 수 없는 논리적 작업 단위입니다.

데이터베이스 시스템에서 동시 작업을 수행할 때 트랜잭션은 가장 작은 제어 단위로 사용되며, 이는 특히 여러 사용자가 동시에 운영하는 데이터베이스 시스템에 적합합니다. 예를 들어 항공사 예약 시스템, 은행, 보험 회사, 증권 거래 시스템 등이 있습니다.

트랜잭션에는 원자성, 일관성, 격리성, 내구성이라는 네 가지 특성이 있으며, 이 네 가지 특성을 일반적으로 ACID라고 합니다.

1. 원자성

트랜잭션은 완전한 작업입니다. 트랜잭션의 요소는 분할할 수 없습니다(원자적). 트랜잭션의 모든 요소는 전체적으로 커밋되거나 롤백되어야 합니다. 트랜잭션의 요소 하나라도 실패하면 전체 트랜잭션이 실패합니다.

은행 송금 거래를 예로 들면, 거래가 제출되면 두 계좌의 데이터가 업데이트됩니다. 어떤 이유로 두 계정을 성공적으로 업데이트하기 전에 트랜잭션이 종료되면 두 계정의 잔액이 업데이트되지 않고 계정 잔액에 대한 수정 사항이 취소되며 트랜잭션이 부분적으로 커밋될 수 없습니다.

2. 일관성

트랜잭션이 완료되면 데이터는 일관된 상태여야 합니다. 즉, 데이터베이스에 저장된 데이터는 트랜잭션이 시작되기 전에도 일관된 상태를 유지합니다. 진행 중인 트랜잭션 중에 데이터는 일관되지 않은 상태에 있을 수 있습니다. 예를 들어 데이터가 부분적으로 수정될 수 있습니다. 그러나 트랜잭션이 성공적으로 완료되면 데이터는 알려진 일관된 상태로 다시 반환되어야 합니다. 트랜잭션을 통해 데이터를 수정해도 데이터가 손상되거나 트랜잭션이 데이터 저장소를 불안정한 상태로 둘 수 없습니다.

은행 송금 거래를 예로 들어보겠습니다. 거래가 시작되기 전에는 모든 계정 잔액의 총액이 일관된 상태를 유지합니다. 거래가 진행되는 동안 한 계정의 잔액은 줄어들지만 다른 계정의 잔액은 수정되지 않습니다. 따라서 모든 계정 잔액의 합계가 일치하지 않습니다. 거래가 완료된 후 총 계정 잔액은 다시 일관된 상태로 복원됩니다.

3. 격리

데이터를 수정하는 모든 동시 트랜잭션은 서로 격리되어 있습니다. 즉, 트랜잭션은 독립적이어야 하며 어떤 방식으로든 다른 트랜잭션에 의존하거나 영향을 주어서는 안 됩니다. 데이터를 수정하는 트랜잭션은 동일한 데이터를 사용하는 다른 트랜잭션이 시작되기 전이나 동일한 데이터를 사용하는 다른 트랜잭션이 끝난 후에 데이터에 액세스할 수 있습니다.

또한 트랜잭션이 데이터를 수정할 때 다른 프로세스가 동시에 동일한 데이터를 사용하는 경우 트랜잭션이 성공적으로 커밋될 때까지 데이터 수정 사항이 적용되지 않습니다. Zhang San과 Li Si 간의 이동과 Wang Wu와 Zhao Er 간의 이동은 항상 서로 독립적입니다.

4. 내구성

트랜잭션 내구성이란 시스템 장애 여부와 관계없이 트랜잭션 처리 결과가 영구적이라는 의미입니다.

트랜잭션이 성공적으로 완료된 후 데이터베이스에 대한 변경 사항은 시스템이 실패하더라도 영구적입니다. 즉, 일단 트랜잭션이 커밋되면 트랜잭션으로 인한 데이터 변경 사항이 데이터베이스에 영구적으로 유지됩니다.

트랜잭션의 ACID 원칙은 트랜잭션이 성공적으로 커밋되거나 실패하고 롤백되거나 둘 중 하나가 되도록 보장합니다. 따라서 트랜잭션에 대한 수정 사항을 복구할 수 있습니다. 즉, 트랜잭션이 실패하면 데이터 수정 내용이 트랜잭션이 실행되기 전 상태로 복원됩니다.

MySQL 트랜잭션 실행 구문 및 프로세스

MySQL은 트랜잭션을 지원하기 위해 여러 스토리지 엔진을 제공합니다. 트랜잭션을 지원하는 스토리지 엔진으로는 InnoDB, BDB가 있으며, InnoDB 스토리지 엔진 트랜잭션은 주로 UNDO 로그와 REDO 로그를 통해 구현되며, MyISAM 스토리지 엔진은 트랜잭션을 지원하지 않는다.

확장: 모든 종류의 데이터베이스에는 데이터베이스의 실행 상태, 일일 작업, 오류 메시지 등을 기록하는 다양한 로그가 있으며 MySQL도 예외는 아닙니다. 예를 들어, 루트 사용자가 MySQL 서버에 로그인하면 사용자의 로그인 시간, 실행 작업 등이 로그 파일에 기록됩니다.

MySQL 서버를 유지 관리하려면 MySQL 데이터베이스에서 로그 작업을 수행해야 하는 경우가 많습니다.

  • UNDO 로그: 트랜잭션이 실행되기 전 데이터를 복사하고, 트랜잭션에서 예외가 발생했을 때 데이터를 롤백하는 데 사용됩니다.
  • REDO 로그: 트랜잭션 실행 중에 데이터를 업데이트하는 모든 작업을 기록합니다. 트랜잭션이 커밋되면 콘텐츠가 디스크에 플러시됩니다.

MySQL 데이터베이스 기초 스킬 전체 실습 icon-default.png?t=N7T8https://edu.csdn.net/course/detail/36210
기본 설정에서 각 SQL 문은 트랜잭션, 즉 SQL 문 실행 후 자동으로 제출됩니다. 여러 작업을 전체적으로 결합하려면 BEGIN 또는 START TRANSACTION을 사용하여 트랜잭션을 시작하거나 현재 세션의 자동 제출을 비활성화해야 합니다.

트랜잭션 자동 제출에 대한 자세한 내용은 " MySQL 자동 트랜잭션 제출 설정 " 섹션을  참조하세요.

트랜잭션 실행을 위한 구문 및 프로세스

SQL은 다음 문을 사용하여 트랜잭션을 관리합니다.

1) 거래 시작
BEGIN;

 또는

START TRANSACTION;

이 문은 트랜잭션의 시작점을 명시적으로 표시합니다.

2) 거래 제출

MySQL은 다음 명령문을 사용하여 트랜잭션을 커밋합니다.

COMMIT;

COMMIT은 트랜잭션을 커밋한다는 의미, 즉 트랜잭션의 모든 작업을 커밋한다는 의미로, 구체적으로 트랜잭션 내 데이터베이스에 대한 모든 업데이트가 디스크의 물리적 데이터베이스에 기록되고 트랜잭션이 정상적으로 종료된다는 의미이다.

트랜잭션을 커밋한다는 것은 트랜잭션 시작 이후 실행된 모든 데이터가 수정되어 데이터베이스의 영구적인 부분이 되어 트랜잭션의 종료를 표시한다는 것을 의미합니다. 이 명령이 실행되면 트랜잭션을 롤백할 수 없습니다. 이 작업은 모든 수정 사항이 데이터베이스에 커밋될 준비가 된 경우에만 수행됩니다.

3) 트랜잭션 롤백(실행 취소)

MySQL은 다음 명령문을 사용하여 트랜잭션을 롤백합니다.

ROLLBACK;

ROLLBACK은 트랜잭션을 취소하는 것을 의미합니다. 즉, 트랜잭션 실행 중에 일종의 오류가 발생하여 트랜잭션을 계속 실행할 수 없게 됩니다. 시스템은 트랜잭션에서 데이터베이스에 대해 완료된 작업을 모두 취소하고 처음 상태로 롤백합니다. 거래의. 여기서 작업은 데이터베이스에 대한 업데이트 작업을 나타냅니다.

트랜잭션 실행 중 오류가 발생하면 ROLLBACK 문을 사용하여 트랜잭션을 시작 지점이나 지정된 보류 지점으로 롤백합니다. 동시에 시스템은 트랜잭션 시작 지점이나 특정 저장 지점까지 이루어진 모든 데이터 수정 사항을 삭제하고 트랜잭션에 의해 제어되는 리소스를 해제합니다. 따라서 이 진술은 거래의 종료를 표시하기도 합니다.

요약하다

BEGIN 또는 START TRANSACTION 문 다음에 오는 SQL 문에 의한 데이터베이스 데이터 업데이트 작업은 ROLLBACK 문 또는 COMMIT 문이 발생할 때까지 트랜잭션 로그에 기록됩니다. 트랜잭션 내의 연산이 실패하고 ROLLBACK 문이 실행되면 트랜잭션 문을 연 후 업데이트된 모든 데이터를 트랜잭션 시작 전 상태로 롤백할 수 있다. 트랜잭션의 모든 작업이 올바르게 완료되고 COMMIT 문을 사용하여 업데이트된 데이터를 데이터베이스에 제출하는 경우 이 시점의 데이터는 새로운 일관된 상태가 됩니다.

예시 시연

다음은 MySQL 트랜잭션의 구체적인 사용법을 보여주는 두 가지 예입니다.

실시예 1

다음은 Zhang San의 계정이 500위안 감소했지만 Li Si의 계정은 500위안 증가하지 않은 후 다른 세션이 데이터 테이블에 액세스하는 시나리오를 시뮬레이션합니다. 코드는 두 개의 윈도우에서 실행되어야 하므로, 읽기의 편의를 위해 여기서는 A 윈도우, B 윈도우라고 부르겠습니다.

1) A창에서 트랜잭션을 열고 mybank 데이터베이스에 있는 은행 테이블의 데이터를 업데이트합니다.SQL 문과 실행 결과는 다음과 같습니다.

mysql> USE mybank;
Database changed
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE bank SET currentMoney = currentMoney-500
    -> WHERE customerName='张三';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

2) B창의 은행 데이터 테이블에 있는 데이터를 조회합니다. SQL 문 및 실행 결과는 다음과 같습니다.

mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

결과를 보면, 윈도우 A의 트랜잭션이 은행 테이블의 데이터를 변경했음에도 불구하고 데이터가 즉시 업데이트되지 않으며, 이때 다른 세션에서는 업데이트되기 전에 여전히 데이터를 읽고 있음을 알 수 있습니다.

3) 계속해서 A창에서 트랜잭션을 실행하고 트랜잭션을 제출하면 SQL 문과 실행 결과는 다음과 같습니다.

mysql> UPDATE bank SET currentMoney = currentMoney+500
    -> WHERE customerName='李四';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.07 sec)

4) 다시 B창에서 은행 데이터 테이블의 데이터를 조회합니다. SQL 문 및 실행 결과는 다음과 같습니다.

mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

창 A에서 COMMIT를 실행하여 트랜잭션을 커밋한 후 데이터 업데이트가 함께 제출되고 다른 세션에서 업데이트된 데이터를 읽습니다. 결과를 보면 Zhang San과 Li Si의 총 계정 잔액이 이전 전과 일치하게 유지되어 데이터가 한 일관성 상태에서 다른 일관성 상태로 업데이트되는 것을 알 수 있습니다.

앞서 언급한 것처럼 트랜잭션 실행 중 문제가 발생했을 때, 즉 정상적인 프로세스에 따라 완전한 트랜잭션을 실행할 수 없는 경우에는 ROLLBACK 문을 이용하여 롤백하고, 그 데이터를 이용하여 초기 상태로 복원할 수 있다.

예시 1에서는 Zhang San의 계좌 잔액이 500위안으로 줄었는데, 1,000위안을 더 이체하면 잔액이 마이너스가 되므로 원래 상태로 롤백해야 합니다. 예제 2에 표시된 대로입니다.

실시예 2

Zhang San의 계좌 잔액을 1,000위안 줄이고 거래를 롤백합니다.SQL 문 및 실행 결과는 다음과 같습니다.

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
 
mysql> UPDATE bank SET currentMoney = currentMoney-1000 WHERE customerName='张三';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> ROLLBACK;
Query OK, 0 rows affected (0.07 sec)
 
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

결과를 보면 트랜잭션 롤백을 수행한 후 계정 데이터가 초기 상태, 즉 트랜잭션이 수행되기 전의 상태로 복원되는 것을 알 수 있다.

확장하다

데이터베이스 운영에서는 동시에 읽은 데이터의 정확성을 효과적으로 보장하기 위해 트랜잭션의 격리 수준이 제안됩니다. 예제 1과 예제 2의 데모에서 트랜잭션의 격리 수준은 기본 격리 수준입니다. MySQL에서 트랜잭션의 기본 격리 수준은 REPEATABLE-READ(다시 읽기 가능) 격리 수준입니다. 즉, 트랜잭션이 종료되지 않은 경우(COMMIT 또는 ROLLBACK이 실행되지 않음) 다른 세션에서는 커밋되지 않은 데이터만 읽을 수 있습니다. 자세히 알아보려면 MySQL 트랜잭션 격리 수준을

클릭하세요 .

지침

MySQL 트랜잭션은 리소스를 많이 소모하는 기능이므로 사용 시 다음 사항에 주의해야 합니다.

1) 거래를 가능한 한 짧게 유지하십시오

트랜잭션의 시작부터 끝까지 트랜잭션의 원자성, 일관성, 격리 및 내구성을 보장하기 위해 데이터베이스 관리 시스템에 많은 양의 리소스가 예약됩니다. 다중 사용자 시스템에서는 대규모 트랜잭션이 많은 양의 시스템 리소스를 차지하므로 시스템이 압도당하고 소프트웨어 실행 성능에 영향을 미치며 심지어 시스템 충돌을 일으킬 수도 있습니다.

2) 거래에서 접근하는 데이터의 양은 최소화되어야 한다.

트랜잭션이 동시에 실행되는 경우 트랜잭션이 수행하는 데이터의 양이 적을수록 트랜잭션 간 동일한 데이터에 대한 작업이 줄어듭니다.

3) 데이터를 쿼리할 때 트랜잭션을 사용하지 마세요.

데이터를 찾아보고 쿼리해도 데이터베이스의 데이터가 업데이트되지 않으므로 과도한 시스템 리소스를 차지하지 않도록 트랜잭션을 사용하여 데이터를 쿼리하지 않도록 해야 합니다.

4) 트랜잭션 처리 중에 사용자 입력을 기다리지 마십시오.

트랜잭션을 처리하는 동안 사용자가 데이터를 입력할 때까지 기다려야 한다면 트랜잭션이 오랜 시간 동안 리소스를 점유하게 되어 시스템 정체가 발생할 수 있습니다.

다창 수석 데이터베이스 엔지니어 mysql 데이터베이스 실무 교육 icon-default.png?t=N7T8https://edu.csdn.net/course/detail/39021 

추천

출처blog.csdn.net/m0_37449634/article/details/135554108