Day42-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聯合後的結果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章