您好,登錄后才能下訂單哦!
這篇“MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù)怎么應(yīng)用”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù)怎么應(yīng)用”文章吧。
觸發(fā)器是SQL server提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲過程,是由事件來觸發(fā)。觸發(fā)器經(jīng)常用來加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則。
創(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) );
// 語法格式: 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ù)進(jìn)行日志的記錄 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;
// 查看標(biāo)準(zhǔn)語法: SHOW TRIGGERS; // 查看觸發(fā)器 SHOW TRIGGERS; // 刪除標(biāo)準(zhǔn)語法:DROP TRIGGER 觸發(fā)器名稱; // 刪除account_delete觸發(fā)器 DROP TRIGGER account_delete;
在關(guān)系數(shù)據(jù)庫中,一個事務(wù)可以是一個SQL語句,一組SQL語句或整個程序。其特點(diǎn)是這個單元要么同時成功要么同時失敗,單元中的每條 SQL 語句都相互依賴,形成一個整體。事務(wù)應(yīng)該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
四大特性:
原子性:一個事務(wù)是一個不可分割的工作單位,事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。
一致性:事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
隔離性: 當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離
持久性: 一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
開啟事務(wù):記錄回滾點(diǎn),并通知服務(wù)器
執(zhí)行SQL語句:執(zhí)行具體的一條或多條sql語句
結(jié)束事務(wù)(提交|回滾):提交:沒出現(xiàn)問題,數(shù)據(jù)進(jìn)行更新;回滾:出現(xiàn)問題,數(shù)據(jù)恢復(fù)到開啟事務(wù)時的狀態(tài)
-- 開啟事務(wù) START TRANSACTION; -- 執(zhí)行SQL語句 UPDATE account SET money=money-500 WHERE NAME='張三'; -- 回滾事務(wù)(出現(xiàn)問題) ROLLBACK; -- 提交事務(wù)(沒出現(xiàn)問題) COMMIT;
// 查看提交方式 SELECT @@AUTOCOMMIT; -- 1代表自動提交 0代表手動提交 // 修改事務(wù)的提交方式 SET @@autocommit=1;
四種隔離級別
讀未提交:read uncommitted
讀已提交:read committed (Oracle/SQL Server 數(shù)據(jù)庫默認(rèn)級別)
可重復(fù)讀:repeatable read (MySQL 默認(rèn)級別)
串行化:serializable
可能引發(fā)問題:
臟讀:是指在一個事務(wù)處理過程中讀取了另一個未提交的事務(wù)中的數(shù)據(jù) , 導(dǎo)致兩次查詢結(jié)果不一致
不可重復(fù)讀:是指在一個事務(wù)處理過程中讀取了另一個事務(wù)中修改并已提交的數(shù)據(jù), 導(dǎo)致兩次查詢結(jié)果不一致
幻讀:select 某記錄是否存在,不存在,準(zhǔn)備插入此記錄,但執(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 隔離級別.
以上就是關(guān)于“MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù)怎么應(yīng)用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。