事務
事務就是需要在同一個處理單元中執行的一系列更新處理的 集合
事務是必須滿足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;