事務、觸發器、視圖

事務

事務及其ACID屬性

事務是由一組SQL語句組成的邏輯處理單元。
事務具有以下4個特性,簡稱爲事務ACID屬性。

ACID屬性 含義
原子性(Atomicity) 事務是一個原子操作單元,其對數據的修改,要麼全部成功,要麼全部失敗。
一致性(Consistent) 在事務開始和完成時,數據都必須保持一致狀態。
隔離性(Isolation) 數據庫系統提供一定的隔離機制,保證事務在不受外部併發操作影響的 “獨立” 環境下運行。
持久性(Durable) 事務完成之後,對於數據的修改是永久的。

併發事務處理帶來的問題

問題 含義
丟失更新(Lost Update) 當兩個或多個事務選擇同一行,最初的事務修改的值,會被後面的事務修改的值覆蓋。
髒讀(Dirty Reads) 當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。
不可重複讀(Non-Repeatable Reads) 一個事務在讀取某些數據後的某個時間,再次讀取以前讀過的數據,卻發現和以前讀出的數據不一致。
幻讀(Phantom Reads) 一個事務按照相同的查詢條件重新讀取以前查詢過的數據,卻發現其他事務插入了滿足其查詢條件的新數據。

事務隔離級別

爲了解決上述提到的事務併發問題,數據庫提供一定的事務隔離機制來解決這個問題。數據庫的事務隔離越嚴格,併發副作用越小,但付出的代價也就越大,因爲事務隔離實質上就是使用事務在一定程度上“串行化” 進行,這顯然與“併發” 是矛盾的。

數據庫的隔離級別有4個,由低到高依次爲Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決髒寫、髒讀、不可重複讀、幻讀這幾類問題。

隔離級別 丟失更新 髒讀 不可重複讀 幻讀
Read uncommitted ×(可解決)
Read committed × (可解決) ×(可解決)
Repeatable read(默認) × (可解決) × (可解決) ×(可解決)
Serializable × (可解決) ×(可解決) × (可解決) × (可解決)

Mysql 的數據庫的默認隔離級別爲 Repeatable read , 查看方式:

show variables like 'tx_isolation';

在這裏插入圖片描述

觸發器

DELIMITER該關鍵字用來聲明SQL語句的分隔符 , 告訴 MySQL 解釋器,該段命令是否已經結束了,mysql是否可以執行了。默認情況下,delimiter是分號;。在命令行客戶端中,如果有一行命令以分號結束,那麼回車後,mysql將會執行該命令。

介紹

觸發器是與表有關的數據庫對象,指在 insert/update/delete 之前或之後,觸發並執行觸發器中定義的SQL語句集合。觸發器的這種特性可以協助應用在數據庫端確保數據的完整性 , 日誌記錄 , 數據校驗等操作 。

使用別名 OLD 和 NEW 來引用觸發器中發生變化的記錄內容,這與其他的數據庫是相似的。現在觸發器還只支持行級觸發,不支持語句級觸發。

觸發器類型 NEW 和 OLD的使用
INSERT 型觸發器 NEW 表示將要或者已經新增的數據
UPDATE 型觸發器 OLD 表示修改之前的數據 , NEW 表示將要或已經修改後的數據
DELETE 型觸發器 OLD 表示將要或者已經刪除的數據

語法格式:

create trigger trigger_name 
before/after insert/update/delete
on tbl_name 
[ for each row ]  -- 行級觸發器
begin
	trigger_stmt ;
end;

例子

創建 insert 型觸發器,完成插入數據時的日誌記錄 :

DELIMITER $

create trigger emp_logs_insert_trigger
after insert 
on emp 
for each row 
begin
  insert into emp_logs (id,operation,operate_time,operate_id,operate_params) 
  values(null,'insert',now(),new.id,concat('插入後(id:',new.id,', name:',new.name,', age:',new.age,', salary:',new.salary,')'));	
end $

DELIMITER ;

創建 update 型觸發器,完成更新數據時的日誌記錄 :

DELIMITER $

create trigger emp_logs_update_trigger
after update 
on emp 
for each row 
begin
  insert into emp_logs (id,operation,operate_time,operate_id,operate_params) 
  values(null,'update',now(),new.id,concat('修改前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.salary,') , 修改後(id',new.id, 'name:',new.name,', age:',new.age,', salary:',new.salary,')'));                                                                      
end $

DELIMITER ;

創建delete 行的觸發器 , 完成刪除數據時的日誌記錄 :

DELIMITER $

create trigger emp_logs_delete_trigger
after delete 
on emp 
for each row 
begin
  insert into emp_logs (id,operation,operate_time,operate_id,operate_params) 
  values(null,'delete',now(),old.id,concat('刪除前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.salary,')'));                                                                      
end $

DELIMITER ;

刪除觸發器

語法結構 :

drop trigger [schema_name.]trigger_name

如果沒有指定 schema_name,默認爲當前數據庫 。

查看觸發器

可以通過執行 SHOW TRIGGERS 命令查看觸發器的狀態、語法等信息。
語法結構 :

show triggers ;

視圖

視圖(View)是一種虛擬存在的表。視圖並不在數據庫中實際存在,行和列數據來自定義視圖的查詢中使用的表,並且是在使用視圖時動態生成的。通俗的講,視圖就是一條SELECT語句執行後返回的結果集。所以我們在創建視圖的時候,主要的工作就落在創建這條SQL查詢語句上。

視圖相對於普通的表的優勢主要包括以下幾項。

  • 簡單:使用視圖的用戶完全不需要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來說已經是過濾好的複合條件的結果集。
  • 安全:使用視圖的用戶只能訪問他們被允許查詢的結果集,對錶的權限管理並不能限制到某個行某個列,但是通過視圖就可以簡單的實現。
  • 數據獨立:一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響。

創建視圖的語法爲:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

修改視圖的語法爲:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
選項 : 
	WITH [CASCADED | LOCAL] CHECK OPTION 決定了是否允許更新數據使記錄不再滿足視圖的條件。
	LOCAL : 只要滿足本視圖的條件就可以更新。
	CASCADED : 必須滿足所有針對該視圖的所有視圖的條件纔可以更新。 默認值.

示例 , 創建city_country_view視圖 , 執行如下SQL :

create or replace view city_country_view 
as 
select t.*,c.country_name from country c , city t where c.country_id = t.country_id;

查詢視圖

SHOW VIEWS

刪除視圖

DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT | CASCADE]	
# 例
DROP VIEW city_country_view ;

本文參考www.itheima.com學習資料,只用於本人學習筆記總結,不可轉載,如有侵權請諒解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章