前言: 由於大一學習數據庫不紮實,學到後面有點吃力,所以回過頭來認真學習一邊,寫一些學習總結,提醒自己。也要告誡讀者,把基礎打紮實。讀者覺得有用的話可以
收藏點贊哦!
事務的ACID原則
A : 原子性: 要麼都成功,要麼都失敗。
C : 一致性:一個事務執行會使數據從一個一致狀態到另一個一致狀態。
I :隔離性:一個事務的執行不會受到其他事務的干擾。
D :持久性: 事務一旦提交,則會永久的改變數據庫的數據。
事務的創建
事務的創建分爲兩類:隱式事務,顯式事務。
- 隱式事務:事務沒有明顯的開啓和結束的語句或標記。
- 像我們常見的 DML 語言,insert、update、delete語句,這些語句執行就相當於開啓了事務。
SHOW VARIABLES LIKE 'autocommit'
結果:
Variable_name | Value |
---|---|
autocommit | ON |
數據庫默認開啓了自動提交的功能。
- 顯式事務:事務有明顯的開啓和結束的語句或標記。
- 前提: 必須先設置自動提交功能爲禁用。
set autocommit=0; # 關閉事務自動提交的功能
SHOW VARIABLES LIKE 'autocommit' # 查看
結果:
Variable_name | Value |
---|---|
autocommit | OFF |
注意點: 關閉自動提交功能只對當前會話有效,關閉數據庫從新打開就失效了。
顯式事務開啓與結束
步驟1: 開啓事務。
set autocommit=0;
start transaction; #(可選的)可以寫也可以不寫
步驟2: 編寫事務中的sql語句。
語句一;
語句二;
語句三;
…
步驟3:結束事務。
commit; #提交事務
rollback; # 回滾事務。
事務併發問題
對於同時運行多個事務,當這些事務訪問數據庫中相同的數據
時,如果沒有采用必要的隔離機制,就會導致各種併發問題。
髒讀
對於兩個事務 1 和 2 ,1 讀取了已經被 2 更新但是沒有提交
的字段,若2 回滾以後,1 讀取的內容就是臨時的且無效的。
不可重複讀
對於兩個事務 1 和 2 ,1 讀取了表中的一個字段,然後 2 更新
了該字段之後,1 再次 讀取同一個字段,值就不同了。
幻讀
對於兩個事務 1 和 2 ,1 讀取了表中的一個字段,然後 2 在該表中插入
了一些新數據之後,1 再次 讀取同一個表,就會多出幾行。
數據庫的隔離級別
數據庫系統必須具有隔離併發運行各個事務的能力,使它們不會相互影響, 避免各種併發問題.
一個事務與其他事務隔離的程度稱爲隔離級別.
數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,數據一致性就越好,但併發性越弱。
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read commited | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
-
Oracle 支持的 2 種事務隔離級別:READ COMMITED,
SERIALIZABLE。 Oracle 默認的事務隔離級別爲: READ
COMMITED -
Mysql 支持 4 種事務隔離級別. Mysql 默認的事務隔離級別
爲: REPEATABLE READ
savepoint 的使用
只能搭配 rollback
示例:
set autocommit=0;
start transaction;
DELETE FROM boys WHERE id=1;
savepoint a; # 設置保存點
DELETE FROM boys WHERE id=2;
rollback to a; # 回滾到a, id=2 的信息沒有刪除,但是id=1 的已經刪除
總結: 數據庫這門語言呢,不難,但是要多練,沒有捷徑。讀者覺得有用的話可以
收藏點贊
哦!