MySQL 事務你會了嗎?

前言: 由於大一學習數據庫不紮實,學到後面有點吃力,所以回過頭來認真學習一邊,寫一些學習總結,提醒自己。也要告誡讀者,把基礎打紮實。讀者覺得有用的話可以收藏點贊哦!

事務的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 再次 讀取同一個表,就會多出幾行。

數據庫的隔離級別

數據庫系統必須具有隔離併發運行各個事務的能力,使它們不會相互影響, 避免各種併發問題.

一個事務與其他事務隔離的程度稱爲隔離級別.

數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,數據一致性就越好,但併發性越弱。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PWnq0jcP-1589083779656)(C:\Users\FTS36\AppData\Roaming\Typora\typora-user-images\image-20200510114836190.png)]

事務隔離級別 髒讀 不可重複讀 幻讀
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 的已經刪除

總結: 數據庫這門語言呢,不難,但是要多練,沒有捷徑。讀者覺得有用的話可以收藏點贊哦!

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