MySQL數(shù)據(jù)庫的觸發(fā)器和事務
一、觸發(fā)器
概念
觸發(fā)器是SQL server提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關的特殊的存儲過程,是由事件來觸發(fā)。觸發(fā)器經(jīng)常用來加強數(shù)據(jù)的完整性約束和業(yè)務規(guī)則。
二、 觸發(fā)器的操作
創(chuàng)建account和account_log數(shù)據(jù)表:
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) );
觸發(fā)器的增刪改操作
// 語法格式: BEFORE|AFTER INSERT: 插入 UPDATE:更新 DELETE:刪除
// DELIMITER $
// CREATE TRIGGER 觸發(fā)器名稱
// BEFORE|AFTER INSERT|UPDATE|DELETE
// ON 表名
// FOR EACH ROW
// BEGIN
// 觸發(fā)器要執(zhí)行的功能;
// END$
// DELIMITER ;
// 創(chuàng)建INSERT型觸發(fā)器。用于對account表新增數(shù)據(jù)進行日志的記錄
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;觸發(fā)器的查看刪除操作
// 查看標準語法: SHOW TRIGGERS; // 查看觸發(fā)器 SHOW TRIGGERS; // 刪除標準語法:DROP TRIGGER 觸發(fā)器名稱; // 刪除account_delete觸發(fā)器 DROP TRIGGER account_delete;
三、事務
概念
在關系數(shù)據(jù)庫中,一個事務可以是一個SQL語句,一組SQL語句或整個程序。其特點是這個單元要么同時成功要么同時失敗,單元中的每條 SQL 語句都相互依賴,形成一個整體。事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
四大特性:
- 原子性:一個事務是一個不可分割的工作單位,事務包含的所有操作要么全部成功,要么全部失敗回滾。
- 一致性:事務必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
- 隔離性: 當多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發(fā)事務之間要相互隔離
- 持久性: 一個事務一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務的操作。
四、事務的操作
基本流程
- 開啟事務:記錄回滾點,并通知服務器
- 執(zhí)行SQL語句:執(zhí)行具體的一條或多條sql語句
- 結束事務(提交|回滾):提交:沒出現(xiàn)問題,數(shù)據(jù)進行更新;回滾:出現(xiàn)問題,數(shù)據(jù)恢復到開啟事務時的狀態(tài)
基礎操作
-- 開啟事務 START TRANSACTION; -- 執(zhí)行SQL語句 UPDATE account SET money=money-500 WHERE NAME='張三'; -- 回滾事務(出現(xiàn)問題) ROLLBACK; -- 提交事務(沒出現(xiàn)問題) COMMIT;
事務的提交方式
// 查看提交方式 SELECT @@AUTOCOMMIT; -- 1代表自動提交 0代表手動提交 // 修改事務的提交方式 SET @@autocommit=1;
事務的隔離級別
四種隔離級別
- 讀未提交:read uncommitted
- 讀已提交:read committed (Oracle/SQL Server 數(shù)據(jù)庫默認級別)
- 可重復讀:repeatable read (MySQL 默認級別)
- 串行化:serializable
可能引發(fā)問題:
- 臟讀:是指在一個事務處理過程中讀取了另一個未提交的事務中的數(shù)據(jù) , 導致兩次查詢結果不一致
- 不可重復讀:是指在一個事務處理過程中讀取了另一個事務中修改并已提交的數(shù)據(jù), 導致兩次查詢結果不一致
- 幻讀:select 某記錄是否存在,不存在,準備插入此記錄,但執(zhí)行 insert 時發(fā)現(xiàn)此記錄已存在,無法插入。或不存在執(zhí)行delete刪除,卻發(fā)現(xiàn)刪除成功
隔離操作
// 查詢數(shù)據(jù)庫隔離級別 SELECT @@TX_ISOLATION; // 修改數(shù)據(jù)庫隔離級別 SET GLOBAL TRANSACTION ISOLATION LEVEL 級別字符串;
注意:隔離級別從小到大安全性越來越高,但是效率越來越低 , 所以不建議使用READ UNCOMMITTED 和 SERIALIZABLE 隔離級別.
到此這篇關于MySQL數(shù)據(jù)庫的觸發(fā)器和事務的文章就介紹到這了,更多相關MySQL 觸發(fā)器和事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows Server 2003 下配置 MySQL 集群(Cluster)教程
這篇文章主要介紹了Windows Server 2003 下配置 MySQL 集群(Cluster)教程,本文先是講解了原理知識,然后給出詳細配置步驟和操作方法,需要的朋友可以參考下2015-06-06
MYSQL數(shù)據(jù)庫使用UTF-8中文編碼亂碼的解決辦法
這篇文章主要介紹了MYSQL數(shù)據(jù)庫使用UTF-8中文編碼亂碼的解決辦法,需要的朋友可以參考下2015-10-10
SQL實現(xiàn)LeetCode(176.第二高薪水)
這篇文章主要介紹了SQL實現(xiàn)LeetCode(176.第二高薪水),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
淺談mysql導出表數(shù)據(jù)到excel關于datetime的格式問題
這篇文章主要介紹了淺談mysql導出表數(shù)據(jù)到excel關于datetime的格式問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
淺談MySql?update會鎖定哪些范圍的數(shù)據(jù)
本文主要介紹了記錄一下MySql?update會鎖定哪些范圍的數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06

