MySQL(事務、權限管理、視圖)
事務
一、事務的概念
事務是一個原子操作。是一個最小執行單元。可以由一個或多個SQL語句組成,在同一個事務中,所有的SQL語句都成功執行時,整個事務成功!有一個SQL語句執行失敗,整個事務都執行失敗!
二、事務的邊界
-
開始:連接到數據庫,執行一條DML語句。 上一個事務結束後,又輸入了一條DML語句,即事務的開始
-
結束:
- 提交:
- 顯示提交:COMMIT;
- 隱式提交:一條DML語句。正常退出(客戶端退出鏈接)
- 回滾:
- 顯示回滾:ROLLBACK;
- 隱式回滾:非正常退出(斷電、死機),執行了創建、刪除的語句,但是失敗了!會爲這個無效的SQL語句執行回滾。
- 提交:
三、事務的原理
數據庫會爲每一個客戶端都維護一個空間獨立的緩存區(回滾段),一個事務中所有的增刪改語句的執行結果都會緩存在回滾段中,只有當事務中所有的SQL語句均正常結束(COMMIT),纔會將回滾段中的數據同步到數據庫。否則無論因爲任何原因失敗了,則整個事務回滾(ROLLBACK);
四、事務的特性
Atomicity(原子性)
表示的是一個事務內的所有操作是一個整體,要麼全部成功,要麼全部失敗。
- 對於一個事務來說,不可能只執行其中的一個部分操作,這就是事物的原子性。
Consistency(一致性)
表示一個事務內有一個操作失敗時,所有的更改過得數據都必須回滾到修改前狀態。
- 數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。
Isolation(隔離性)
事務查看數據操作時數據所處的狀態,要麼是另一個併發事務修改數據之前的狀態,要麼是另一個併發事務修改它之後的狀態。事務不會查看中間狀態的數據
- 通常來說,一個事務所做的修改在最終提交以前,對其他事物是不可見的。
Durability(持久性)
事務完成之後,對於數據庫的影響是永久性的。
五、事務的應用
應用環境:基於增刪改語句的操作結果(均返回操作後受影響的行數),可通過程序邏輯手動控制事務的提交或回滾
#開啓事務
START TRANSACTION;#SET autoCommit = 0;#方式2 設置自動提交爲0 關閉自動提交 | 1 開啓自動提交
#1賬戶扣錢
UPDATE account SET money = money - 1000 WHERE id = 1;
#2賬戶加錢
UPDATE account SET money = money + 1000 WHERE id = 2;
#執行提交 ---成功
COMMIT;
#執行回滾 ---失敗
ROLLBACK;
權限管理
一、創建用戶
語法:CREATE USER 用戶名 IDENTIFIED BY 密碼
#創建用戶
CREATE USER 'zhangsan' IDENTIFIED BY '123';
二、授權
語法:GRANT ALL ON 數據庫.表名 TO 用戶名;
#將companydb數據裏的grade表授權給zhangsan
GRANT ALL ON companydb.`grade` TO 'zhangsan';
#將companydb數據庫裏的所有表授權給zhangsan
GRANT ALL ON companydb.* TO 'zhangsan';
三、撤銷權限
語法:REVOKE ALL ON 數據庫.表名 FROM 用戶名
REVOKE ALL ON companydb.grade FROM 'zhangsan';
四、刪除用戶
語法:DROP USER 用戶名;
DROP USER 'zhangsan';
視圖
一、概念
視圖,虛擬表,從一個表中或多個表中查詢出來的結果表,作用和真實表一樣,包含一系列的帶有行和列的數據。視圖中,可以使用SELECT語句查詢數據,也可以使用INSERT、UPDATE、DELETE修改記錄,視圖可以使用戶操作方便,並保障了數據庫系統安全。
二、視圖特點
- 優點
- 簡單化,數據所見即所得
- 安全性,只能查詢或修改視圖中鎖能見到的數據
- 邏輯獨立性,可以屏蔽真實表結構變化帶來的影響。
- 缺點
- 性能相對較差,簡單的查詢會稍微複雜
- 修改不方便,當視圖的數據時複雜的聚合視圖時,無法修改。
三、視圖的創建
語法:CREATE VIEW 視圖名 AS 查詢數據源表的語句;
創建視圖
#創建一個t_empinfo視圖,該視圖的數據是員工姓名,郵箱,手機號碼
CREATE VIEW t_empinfo
AS
SELECT FIRST_NAME,LAST_NAME,email,PHONE_NUMBER FROM t_employees;
使用視圖
#使用視圖
#查詢,所見即所得
SELECT * FROM t_empinfo WHERE FIRST_NAME='Steven' AND LAST_NAME='King';
#修改。只能修改得到的
UPDATE t_empinfo SET email = 'Kings' WHERE FIRST_NAME='Steven' AND LAST_NAME='King';
四、視圖的修改
- 方式一:CREATE OR REPLACE VIEW 視圖名 AS 查詢源表的語句;
存在就替換數據,不存在就新建
CREATE OR REPLACE VIEW t_empinfo
AS
SELECT employee_id,FIRST_NAME,LAST_NAME,email,PHONE_NUMBER FROM t_employees;
- 方式二:ALTER VIEW 視圖名 AS查詢源表的語句;
ALTER VIEW t_empinfo
AS
SELECT FIRST_NAME,LAST_NAME,email,PHONE_NUMBER FROM t_employees;
五、視圖的刪除
語法:DROP VIEW 視圖名
DROP VIEW t_empinfo;
注意:刪除視圖不會影響原表的數據
六、視圖的注意事項
- 視圖不會獨立存儲數據,原表發生改變,視圖的數據也發生改變。沒有優化查詢的性能
- 如果視圖包含以下結構中的一種,則視圖不可更新
- 聚合函數的結果
- GROUP BY分組後的結果
- HAVING篩選過濾後的結果
- UNION、UNION ALL聯合後的結果