English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MySQL 트랜잭션은 대량의 작업과 고도의 복잡성을 처리하는 데 주로 사용됩니다. 예를 들어, 인력 관리 시스템에서 인력을 삭제할 때, 인력의 기본 정보를 삭제하는 것뿐만 아니라, 이 인력과 관련된 정보(예: 이메일, 기사 등)도 삭제해야 합니다. 이렇게 하면 이 데이터베이스 작업 문장들은 하나의 트랜잭션으로 구성됩니다!
MySQL에서는 Innodb 데이터베이스 엔진을 사용하는 데이터베이스 또는 테이블만이 트랜잭션을 지원합니다.
트랜잭션 처리는 데이터베이스의 일관성을 유지하고, 일련의 SQL 문이 모두 실행되거나 모두 실행되지 않도록 보장하는 데 사용될 수 있습니다.
트랜잭션은 insert, update, delete 문을 관리하는 데 사용됩니다.
일반적으로, 트랜잭션은 이 조건을 모두 만족해야 합니다.4개 조건(ACID)::: 원자성(Aatomicity,또는 불분해성)、일관성(C일관성(onsistency)、독립성(I독립성(solation,또는 분리성)、지속성(D유연성(urability)。
원자성:일반적인 트랜잭션(transaction)의 모든 작업은 모두 완료되거나 모두 완료되지 않도록 중간 단계에서 끝나지 않습니다. 트랜잭션 실행 중에 오류가 발생하면 트랜잭션 시작 전 상태로 롤백(Rollback)됩니다. 이렇게 하면 이 트랜잭션이 결코 실행되지 않았는 것처럼 보입니다.
일관성:트랜잭션 시작 전과 종료 후에 데이터베이스의 완전성이 파괴되지 않습니다. 이는 기록된 자료가 모든 사전 규칙에 완전히 일치해야 하며, 자료의 정확성, 연결성 및 데이터베이스가 예측 가능하게 작업을 수행할 수 있어야 한다는 것을 의미합니다.
隔離성:데이터베이스는 여러 동시 트랜잭션을 데이터에 대한 읽기, 쓰기 및 변경에 대해 동시에 처리할 수 있는 능력을 가지고 있습니다.隔離성은 다른 트랜잭션이 동시에 실행될 때 교차 실행으로 인해 데이터의 불일치를 방지할 수 있습니다. 트랜잭션隔離는 다른 수준으로 분류되며, 읽어야 하지 않은 Read uncommitted, Read committed, Repeatableread, Serializable과 같은 수준이 포함됩니다.
지속성:트랜잭션 처리가 끝나면 데이터의 변경 사항은 영구적이며, 시스템 故障으로 인해도 손실되지 않습니다.
MySQL 명령 행의 기본 설정에서는 모든 트랜잭션이 자동으로 제출됩니다. 즉, SQL 문을 실행하면 바로 COMMIT 작업이 수행됩니다. 따라서 명시적으로 트랜잭션을 시작하려면 명령어 BEGIN이나 START TRANSACTION을 사용하거나, 명령어 SET AUTOCOMMIT=0을 통해 현재 세션의 자동 제출을 금지합니다;
BEGIN이나 START TRANSACTION을 통해 명시적으로 트랜잭션을 시작합니다;
COMMIT은 COMMIT WORK와도 동일하게 사용할 수 있습니다. COMMIT은 트랜잭션을 제출하고, 데이터베이스에 대해 모든 변경 사항을 영구적으로 만듭니다;
ROLLBACK은 ROLLBACK WORK와도 동일하게 사용할 수 있습니다. 롤백은 사용자의 트랜잭션을 종료하고, 모든 미제출 변경 사항을 취소합니다;
SAVEPOINT identifier를 통해 트랜잭션에서 저장점을 생성할 수 있습니다. 하나의 트랜잭션에서 여러 개의 SAVEPOINT가 있을 수 있습니다;
RELEASE SAVEPOINT identifier를 통해 트랜잭션의 저장점을 제거합니다. 지정된 저장점이 없을 때, 이 명령어를 실행하면 예외가 발생합니다;
ROLLBACK TO identifier를 통해 트랜잭션을 표시점으로 되돌립니다;
SET TRANSACTION은 트랜잭션의隔離 수준을 설정합니다. InnoDB 스토리지 엔진은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE와 같은 트랜잭션의隔離 수준을 제공합니다.
1BEGIN, ROLLBACK, COMMIT을 통해 구현됩니다
BEGIN 트랜잭션 시작
ROLLBACK 트랜잭션 롤백
COMMIT 트랜잭션 확인
2、자동 커밋 모드를 변경하기 위해 SET을 사용하여:
SET AUTOCOMMIT=0 자동 커밋 비활성화
SET AUTOCOMMIT=1 자동 커밋 활성화
mysql> use w3codebox; Database changed mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb; # 데이터 테이블 생성 Query OK, 0 rows affected (0.04 sec) mysql> select * from w3codebox_transaction_test; Empty set (0.01 sec) mysql> begin; # 트랜잭션 시작 Query OK, 0 rows affected (0.00 sec) mysql> insert into w3codebox_transaction_test value(5); Query OK, 1 rows affected (0.01 sec) mysql> insert into w3codebox_transaction_test value(6); Query OK, 1 rows affected (0.00 sec) mysql> commit; # 트랜잭션 제출 Query OK, 0 rows affected (0.01 sec) mysql> select * from w3codebox_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql> begin; # 트랜잭션 시작 Query OK, 0 rows affected (0.00 sec) mysql> insert into w3codebox_transaction_test values(7); Query OK, 1 rows affected (0.00 sec) mysql> rollback; # 롤백 Query OK, 0 rows affected (0.00 sec) mysql> select * from w3codebox_transaction_test; # 롤백으로 인해 데이터가 삽입되지 않았습니다 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>
<?php $dbhost = 'localhost'; // mysql 서버 호스트 주소 $dbuser = 'root'; // mysql 사용자 이름 $dbpass = '';123456'; // mysql 사용자 이름 비밀번호 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('연결 실패: ' . mysqli_error($conn)); } // 编码 설정, 중국어 일치시키기 방지 mysqli_query($conn, "set names utf8); mysqli_select_db( $conn, 'w3codebox' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 자동 커밋을 설정하지 않음, 왜냐하면 MYSQL이 기본적으로 즉시 실행됨 mysqli_begin_transaction($conn); // 트랜잭션 시작정의 if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(8)") { mysqli_query($conn, "ROLLBACK"); // 실행 실패 시 롤백�断정 } if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(9)") { mysqli_query($conn, "ROLLBACK"); // 실행 실패 시 롤백�断정 } mysqli_commit($conn); //트랜잭션 실행 mysqli_close($conn); ?>