MySQL 트랜잭션
MySQL 트랜잭션
MySQL 트랜잭션은 주로 대규모 작업과 복잡성이 높은 데이터를 처리하는 데 사용됩니다. 예를 들어 인사관리시스템에서 사람을 삭제하면 그 사람의 기본정보도 함께 삭제해야 하고, 사서함, 물품 등 그 사람과 관련된 정보도 함께 삭제해야 한다. 이런 식으로 이들 데이터베이스는 작업문은 거래를 구성합니다.
MySQL에서는 Innodb 데이터베이스 엔진을 사용하는 데이터베이스나 테이블만 트랜잭션을 지원합니다.
트랜잭션 처리를 사용하여 데이터베이스의 무결성을 유지하고 SQL 문 일괄 처리가 모두 실행되거나 전혀 실행되지 않도록 할 수 있습니다.
트랜잭션은 삽입, 업데이트, 삭제 문을 관리하는 데 사용됩니다.
일반적으로 트랜잭션은 4가지 조건(ACID)을 충족해야 합니다: 원자성 또는 불가분성, 일관성, 고립성, 독립성, 내구성.
원자성: 트랜잭션의 모든 작업은 완료되거나 완료되지 않으며 중간 단계에서 끝나지 않습니다. 트랜잭션 실행 중 오류가 발생하면 트랜잭션이 실행되지 않았던 것처럼 트랜잭션이 시작되기 전 상태로 롤백됩니다.
일관성: 트랜잭션 시작 전과 트랜잭션 종료 후에도 데이터베이스 무결성이 손상되지 않습니다. 이는 기록된 데이터가 데이터의 정확성과 연결을 포함하여 미리 설정된 모든 규칙을 완전히 준수해야 하며 후속 데이터베이스가 미리 결정된 작업을 자발적으로 완료할 수 있음을 의미합니다.
격리: 데이터베이스는 여러 동시 트랜잭션이 동시에 데이터를 읽고, 쓰고, 수정할 수 있도록 허용합니다. 격리는 여러 트랜잭션이 동시에 실행될 때 교차 실행으로 인한 데이터 손상을 방지할 수 있습니다. . 트랜잭션 격리는 커밋되지 않은 읽기, 커밋된 읽기, 반복 가능한 읽기 및 직렬화 가능을 포함하여 다양한 수준으로 구분됩니다.
지속성: 트랜잭션이 완료된 후 데이터 수정 사항은 영구적이며 시스템이 실패하더라도 손실되지 않습니다.
참고: MySQL 명령줄의 기본 설정에서는 트랜잭션이 자동으로 커밋됩니다. 즉, SQL 문을 실행한 후 즉시 COMMIT 작업이 실행됩니다. . 따라서 트랜잭션을 명시적으로 시작하려면 BEGIN 또는 START TRANSACTION 명령을 사용하거나 SET AUTOCOMMIT=0 명령을 실행하여 현재 세션에 대한 자동 커밋 사용을 비활성화해야 합니다.
거래 제어문:
BEGIN 또는 START TRANSACTION을 명시적으로 시작합니다.
COMMIT; COMMIT WORK를 사용할 수도 있지만 동일합니다. COMMIT는 트랜잭션을 커밋하고 데이터베이스에 대한 모든 수정 사항을 영구적으로 만듭니다.
ROLLBACK을 사용할 수 있지만 둘은 동일합니다. 롤백은 사용자의 트랜잭션을 종료하고 진행 중인 커밋되지 않은 모든 수정 사항을 취소합니다.
SAVEPOINT 식별자는 트랜잭션에서 저장점 생성을 허용하며 트랜잭션에 여러 SAVEPOINT가 있을 수 있습니다.
RELEASE SAVEPOINT 식별자; 트랜잭션 저장 지점, 지정된 저장 지점이 없는 경우 이 문을 실행하면
ROLLBACK TO 식별자가 표시된 지점으로 롤백됩니다. 🎜 >
SET TRANSACTION은 트랜잭션의 격리 수준을 설정하는 데 사용됩니다. InnoDB 스토리지 엔진이 제공하는 트랜잭션 격리 수준은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ 및 SERIALIZABLE입니다.
MYSQL 트랜잭션 처리에는 두 가지 주요 방법이 있습니다.
1. COMMIT- BEGIN을 구현하여 트랜잭션 시작
- ROLLBACK 트랜잭션 롤백
- COMMIT 트랜잭션 확인
- SET AUTOCOMMIT=0 자동 커밋 금지
- SET AUTOCOMMIT=1 자동 커밋 켜기
mysql> use DEMO; Database changed mysql> CREATE TABLE demo_transaction_test( id int(5)) engine=innodb; # 创建数据表 Query OK, 0 rows affected (0.04 sec) mysql> select * from demo_transaction_test;Empty set (0.01 sec) mysql> begin; # 开始事务Query OK, 0 rows affected (0.00 sec) mysql> insert into demo_transaction_test value(5);Query OK, 1 rows affected (0.01 sec) mysql> insert into demo_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 demo_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 demo_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 demo_transaction_test; # 因为回滚所以数据没有插入+------+ | id | +------+ | 5 | | 6 | +------+2 rows in set (0.01 sec) mysql>
PHP에서 트랜잭션 인스턴스 사용
MySQL ORDER BY 테스트:<?php
$dbhost = 'localhost'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = 'root'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('连接失败: ' . mysqli_error($conn));}
// 设置编码,防止中文乱码
mysqli_query($conn, "set names utf8");
mysqli_select_db( $conn, 'DEMO' );
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn); // 开始事务定义
if(!mysqli_query($conn, "insert into demo_transaction_test (id) values(8)"))
{ mysqli_query($conn, "ROLLBACK");// 判断当执行失败时回滚}
if(!mysqli_query($conn, "insert into demo_transaction_test (id) values(9)")){
mysqli_query($conn, "ROLLBACK");// 判断执行失败时回滚
}
mysqli_commit($conn); //执行事务
mysqli_close($conn);
?>
: