>  기사  >  데이터 베이스  >  MySQL 데이터베이스에서 트리거 및 트랜잭션을 적용하는 방법

MySQL 데이터베이스에서 트리거 및 트랜잭션을 적용하는 방법

WBOY
WBOY앞으로
2023-05-28 16:25:191087검색

1. Trigger

Concept

Trigger는 데이터 무결성을 보장하기 위해 SQL 서버에서 제공하는 방법으로, 이벤트에 의해 트리거됩니다. 트리거는 데이터 무결성 제약 조건과 비즈니스 규칙을 적용하는 데 자주 사용됩니다.

2. 트리거 작업

계정 및 account_log 데이터 테이블 만들기:

CREATE TABLE account(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),			
	money DOUBL
);
INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
CREATE TABLE account_log(
	id INT PRIMARY KEY AUTO_INCREMENT,
	operation VARCHAR(20),			
	operation_time DATETIME,		
	operation_id INT,			
	operation_params VARCHAR(200)      
);

트리거 작업 추가, 삭제 및 수정

// 语法格式: BEFORE|AFTER    INSERT: 插入 UPDATE:更新  DELETE:删除
// DELIMITER $
// CREATE TRIGGER 触发器名称
// BEFORE|AFTER INSERT|UPDATE|DELETE
// ON 表名
// FOR EACH ROW
// BEGIN
// 	触发器要执行的功能;
// END$
// DELIMITER ;


// 创建INSERT型触发器。用于对account表新增数据进行日志的记录
DELIMITER $

CREATE TRIGGER account_insert
AFTER INSERT
ON account
FOR EACH ROW
BEGIN
	INSERT INTO account_log VALUES (NULL,'INSERT',NOW(),new.id,CONCAT('插入后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
END $

DELIMITER ;

// 向account表添加一条记录
INSERT INTO account VALUES (NULL, '王五', 2000);

// 查询account表
SELECT * FROM account;

트리거 작업 보기 및 삭제

// 查看标准语法: SHOW TRIGGERS;
// 查看触发器
SHOW TRIGGERS;


// 删除标准语法:DROP TRIGGER 触发器名称;
// 删除account_delete触发器
DROP TRIGGER account_delete;

3. 관계 데이터베이스에서 트랜잭션은 SQL 문, SQL 문 집합 또는 전체 프로그램이 될 수 있습니다. 특징은 이 단위가 동시에 성공하거나 실패하며, 단위의 각 SQL 문이 서로 의존하여 전체를 형성한다는 것입니다. 트랜잭션에는 원자성, 일관성, 격리성, 내구성이라는 네 가지 속성이 있어야 합니다. 이 네 가지 속성을 흔히

ACID 속성

이라고 합니다.

네 가지 주요 기능:

원자성:
    트랜잭션에 포함된 모든 작업은 성공하거나 실패할 경우 롤백됩니다.
  • 일관성:
  • 트랜잭션은 데이터베이스를 하나의 일관성 상태에서 다른 일관성 상태로 변경해야 합니다. 즉, 트랜잭션은 실행 전후에 일관된 상태에 있어야 합니다.
  • 격리:
  • 동일한 테이블을 운영하는 경우와 같이 여러 사용자가 동시에 데이터베이스에 액세스하는 경우 각 사용자에 대해 데이터베이스에서 열린 트랜잭션은 다른 트랜잭션의 작업에 의해 방해를 받을 수 없습니다. 여러 동시 트랜잭션은 분리되어야 합니다. 격리
  • 지속성:
  • 일단 트랜잭션이 제출되면 데이터베이스의 데이터 변경 사항은 영구적입니다. 데이터베이스 시스템에 오류가 발생하더라도 트랜잭션 제출 작업은 손실되지 않습니다.
  • 4. 트랜잭션 작업

  • 기본 프로세스

트랜잭션 시작:
    롤백 지점을 기록하고 서버에 알림
  • SQL 문 실행:
  • 하나 이상의 특정 SQL 문 실행
  • 트랜잭션 종료(제출|롤백): 제출
  • : 문제 발생하지 않음, 데이터가 업데이트됨
  • Rollback

    : 문제 발생, 데이터가 트랜잭션이 시작되었을 때의 상태로 복원됨기본 작업

    -- 开启事务
    START TRANSACTION;
    
    -- 执行SQL语句
    UPDATE account SET money=money-500 WHERE NAME='张三';
    
    -- 回滚事务(出现问题)
    ROLLBACK;
    
    -- 提交事务(没出现问题)
    COMMIT;
  • 트랜잭션 제출 방법
// 查看提交方式
SELECT @@AUTOCOMMIT;  -- 1代表自动提交    0代表手动提交
// 修改事务的提交方式
SET @@autocommit=1;

트랜잭션 격리 수준

4가지 격리 수준

커밋되지 않은 읽기:
    커밋되지 않은 읽기
  • 커밋된 읽기:
  • 커밋된 읽기(Oracle/SQL Server 데이터베이스 기본 수준)
  • 반복 읽기:
  • 반복 읽기(MySQL 기본 수준)
  • Serialized
  • 문제가 발생할 수 있음:

더티 읽기:

는 커밋되지 않은 다른 데이터를 의미합니다. 한 트랜잭션 중에 ted 트랜잭션을 읽었습니다.
  • 반복 불가능한 읽기:

    한 트랜잭션 중에 다른 트랜잭션에서 데이터를 읽는 것을 의미합니다. 수정되어 제출된 데이터로 인해 두 쿼리 간에 일치하지 않는 쿼리 결과가 발생했습니다
  • 팬텀 읽기:

    특정 레코드가 존재하는지 선택하세요. 이 레코드를 삽입하려고 준비했는데, 삽입 실행 시 이 레코드가 이미 존재하여 삽입할 수 없는 것을 발견했습니다. 또는 삭제 삭제가 존재하지 않는데 삭제가 성공한 것으로 확인됨
  • 격리 작업

    // 查询数据库隔离级别
    SELECT @@TX_ISOLATION;
    
    // 修改数据库隔离级别
    SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

  • 참고:
소규모에서 대규모로 격리 수준이 점점 높아지지만 효율성은 점점 낮아지고 있습니다. 이므로 READ UNCOMMITTED 및 SERIALIZABLE 격리 수준을 사용하지 않는 것이 좋습니다.

위 내용은 MySQL 데이터베이스에서 트리거 및 트랜잭션을 적용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제