事務和視圖筆記

事務

事務就是需要在同一個處理單元中執行的一系列更新處理的 集合

事務是必須滿足4個條件(ACID):

原子性(Atomicity): 事務中的操作要麼全部執行,要麼全部不執行

一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態

隔離性(Isolation): 事務的執行不能被其他事務影響,事務之間互不干擾

持久性(Durability): 事務一旦提交,對數據庫的數據的影響就是永久性的

注意:在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。

 

事務控制語句:

BEGIN或START TRANSACTION; 顯式地開啓一個事務

COMMIT; 提交事務,也可以用COMMIT WORK,不過二者是等價的,永久性修改數據。

ROLLBACK; 回滾會結束用戶的事務,也可以用ROLLBACK WORK,撤銷正在進行的所有未提交的修改

SAVEPOINT identifier;SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個保存點。

RELEASE SAVEPOINT identifier; 刪除一個事務的保存點,沒有指定時,執行會拋出一個異常

ROLLBACK TO identifier; 把事務回滾到標記點;

SET TRANSACTION; 用來設置事務的隔離級別。InnoDB存儲引擎提供事務的

 

MYSQL 事務處理 主要有兩種方法:

1、用 BEGIN, ROLLBACK, COMMIT來實現

BEGIN  開始事務

ROLLBACK  事務回滾

COMMIT  事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

SET AUTOCOMMIT=0 禁止自動提交

SET AUTOCOMMIT=1 開啓自動提交

 

示例:

SET AUTOCOMMIT=0;

SET TRANSACTION;

DROP TABLE nteam;

UPDATE sc SET Grade = 81 WHERE Grade = 80;

DELETE FROM student WHERE Sname = '陳冬';

INSERT INTO student VALUE(9521105, '陳冬', '男', 19, '數學系');

UPDATE student SET Sage = 20 WHERE Sname = '陳冬';

COMMIT;

 

數據的隔離性:

(隔離級別越高,數據一致性越好,但併發性越弱)

隔離級別:

READ UNCOMMITTED:允許事務讀取未被其他事務提交的變更,髒讀、不可重複讀和幻讀問題都出現

READ COMMITTED:只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不能避免其他的

REPEATABLE READ:確保事務可以多次從一個字段中取相同的值,事務期間,禁止其他的事務對此字段盡心更新,可以避免髒讀、不可重複讀,但不能避免幻讀

SERIALIZABLE:確保事務可以從一個表中讀取相同的行,事務期間,禁止其他事務對該表執行插入、更新和刪除操作,問題可以都避免,但性能十分低下。

設置隔離級別:set session transaction isolation level read committed;

查看當前隔離級別:select @@transaction_isolation;(mysql8.0,之前的使用tx_isolation)

 

對於同事運行的多個事務,當這些事務訪問數據庫中相同的數據時,如果沒有采取必要的隔離機制,就會導致各種問題:

🐖、髒讀:對於兩個事務T1,T2,T1讀取了已經被T2更新但還沒有被提交的字段,之後,若T2回滾,T1讀取的呢榮就是臨時且無效的。

🐱、不可重複讀:對於兩個事務T1,T2,T1讀取了一個字段,然後T2更新該字段,之後,T1再次讀取了同一個字段,值就不同了

🐶、幻讀:對於兩個事務T1,T2,T1從一個表中讀取了一個字段,然後T2在該表中插入了新的行,之後,如果T1再次讀取同一個表,就會多出幾行

 

視圖

將經常使用的複雜的 SELECT 語句做成視圖。

視圖的作用:

簡單化、安全性、邏輯數據獨立性

創建視圖的 CREATE VIEW 語句

CREATE [OR REPLACE] [ALGORITHM] # REPLACE替換已創建的視圖,ALGORITHM選擇算法

VIEW view_name [(column_list)] # column_list屬性列

AS 查詢語句

示例:

CREATE VIEW ProductSum (product_type, cnt_product)

AS SELECT product_type, COUNT(*)

FROM Product

GROUP BY product_type;

查看視圖:

DESC view_name;

SHOW CREATE VIEW 視圖名;

SHOW TABLE STATUS LIKE '視圖名';

修改視圖:

CREATE OR REPLACE VIEW 視圖名 AS SQL語句;

ALTER VIEW 視圖名 AS SQL語句;

更新視圖:

更新視圖是指通過視圖來增刪改基本表中的數據,支持INSERT、UPDATE、DELETE

視圖無法被更新的情況:

(1)視圖中不包含基表中被定義爲非空的列。

(2)在定義視圖的SELECT 語句後的字段列表中使用聚合函數。

(3)在定義視圖的SELECT 語句後的字段列表中使用聚合函數。

(4)在定義視圖的SELECT 語句中使用了DISTINCT,UNION,TOP,GROUP BY或HAVING子句中。

刪除視圖:

DROP VIEW [IF EXISTS] view_name;

 

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