事務
事務及其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學習資料,只用於本人學習筆記總結,不可轉載,如有侵權請諒解。