1. 程式人生 > 其它 >第十一節----事務

第十一節----事務

技術標籤:MySQL資料庫mysqlsql

TCL:Transaction control language(事務控制語言)
事務:一個或一組sql語句組成一個執行單元,這個執行要麼全部執行,要麼全部不執行
特點(ACID):
1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
2. 一致性(Consistency)
事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態 。
3. 隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
4.
永續性(Durability) 永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來的其他操作和資料庫故障不應該對其有任何影響

事務的建立:

隱式事務:事務沒有明顯的開啟和結束的標記
比如:insert、update、delete
顯式事務:事務具有明顯的開啟和結束的標記
前提:必須先設定自動提交功能為禁用
步驟1:開啟事務
set autocommit=0;
start transaction;可選的
步驟2:編寫事務中的sql語句
語句一;
語句二;
.........
步驟3:結束事務
commit;提交事務
rollback;回滾事務

savepoint:節點名;
設定儲存點 #演示: set autocommit=0; start transaction; delete from tab_identity where id = 1; savepoint a;#設定儲存點 delete from account where id = 20; rollback to a;回滾到儲存點

事務併發問題:

對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有采取必要的隔離機制, 就會導致各種併發問題:
髒讀: 對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的欄位.之後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位.之後, T1再次讀取同一個欄位, 值就不同了.
幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.

事物的隔離級別:

資料庫事務的隔離性: 資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響, 避免各種併發問題.
一個事務與其他事務隔離的程度稱為隔離級別. 資料庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 資料一致性就越好, 但併發性越弱

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-eXjgwfP2-1611225805184)(C:\Users\wuwenbin\Desktop\image-20210121144238260.png)]

Mysql 支援 4 種事務隔離級別. Mysql 預設的事務隔離級別為: REPEATABLE READ
Oracle 支援的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 預設的事務隔離級別為: READCOMMITED
每啟動一個 mysql 程式, 就會獲得一個單獨的資料庫連線. 每個資料庫連線都有一個全域性變數 @@tx_isolation, 表示當前的事務隔離級別.
檢視當前的隔離級別: SELECT @@tx_isolation;
設定當前 mySQL 連線的隔離級別:
set  transaction isolation level read committed;
設定資料庫系統的全域性的隔離級別:
set global transaction isolation level read committed;

據庫系統的全域性的隔離級別:
set global transaction isolation level read committed;