ホームページ  >  記事  >  データベース  >  MySQL データベースにトリガーとトランザクションを適用する方法

MySQL データベースにトリガーとトランザクションを適用する方法

WBOY
WBOY転載
2023-05-28 16:25:191087ブラウズ

1. トリガー

概念

トリガーは、データの整合性を確保するために SQL Server によってプログラマやデータ アナリストに提供されるメソッドです。これはテーブル イベントに関連しています。特別なストアド プロシージャは、以下によってトリガーされます。イベント。トリガーは、データ整合性の制約とビジネス ルールを強制するためによく使用されます。

2. トリガー操作

account および 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 ステートメントが相互に依存して全体を形成することです。トランザクションには、原子性、一貫性、分離性、耐久性という 4 つの属性が必要です。これら 4 つのプロパティは、ACID プロパティと呼ばれることがよくあります。

4 つの主要な特性:

  • 原子性: トランザクションは分割できない作業単位であり、トランザクションにはすべての操作が含まれます。成功または失敗し、ロールバックされます。

  • 一貫性: トランザクションは、データベースをある一貫性状態から別の一貫性状態に変更させる必要があります。つまり、トランザクションは実行の前後に実行される必要があります。 . 一貫した状態にあります。

  • 分離: 同じテーブルを操作する場合など、複数のユーザーが同時にデータベースにアクセスする場合、各ユーザーに対してデータベースによって開かれたトランザクションは、他のユーザーが使用することはできません。トランザクション 操作による干渉、複数の同時トランザクションは互いに分離する必要がある

  • 永続性: トランザクションが送信されると、データベース内のデータは永続的に変更されます。 、データベース システムに障害が発生した場合でも、トランザクションをコミットする操作は失われません。

#4. トランザクション操作

基本的な処理

  • ##トランザクションを開く:

    ロールバックポイントを記録し、通知するサーバー

  • SQL ステートメントを実行します:

    1 つ以上の特定の SQL ステートメントを実行します

  • トランザクションを終了します ( submit|rollback): Submit

    : 問題は発生せず、データは更新されます; 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 デフォルト レベル)
  • シリアル化:
  • serializable
  • は問題を引き起こす可能性があります:

ダーティ リード:
    は、コミットされていない別のトランザクションのデータが読み取られたことを指します。トランザクション処理により、一貫性のないクエリ結果が発生します。
  • Non-repeatable read:
  • はトランザクションを指します。処理中に、別のトランザクションで変更および送信されたデータが読み取られました。一貫性のないクエリ結果が発生します。
  • ファントム リーディング:
  • 特定のレコードが存在するかどうかを選択してください。レコードは存在しません。このレコードは挿入する準備ができていましたが、挿入されると挿入を実行すると、レコードがすでに存在しており、挿入できないことが判明しました。または、削除を実行しますが、削除が成功したことがわかります。
  • 分離操作

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

分離レベルは、小規模から大規模までは高ですが、効率はますます低下しているため、READ UNCOMMITTED および SERIALIZABLE 分離レベルを使用することはお勧めできません。

以上がMySQL データベースにトリガーとトランザクションを適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。