首頁 > 軟體

MySQL資料庫事務原理及應用

2023-11-22 14:01:39

1 事務的使用

1.1 事務概念

事務就是一組DML語句組成,這些語句在邏輯上存在相關性,這一組DML語句要麼全部成功,要麼全部失敗,是一個整體。MySQL提供一種機制,保證我們達到這樣的效果。事務還規定不同的使用者端看到的資料是不相同的。

事務就是要做的或所做的事情,主要用於處理操作量大,複雜度高的資料。假設一種場景:你畢業了,學校的教務系統後臺 MySQL 中,不在需要你的資料,要刪除你的所有資訊(一般不會:) ), 那麼要刪除你的基本資訊(姓名,電話,籍貫等)的同時,也刪除和你有關的其他資訊,比如:你的各科成績,你在校表現,甚至你在論壇發過的文章等。這樣,就需要多條 MySQL 語句構成,那麼所有這些操作合起來,就構成了一個事務。

正如我們上面所說,一個 MySQL 資料庫,可不止你一個事務在執行,同一時刻,甚至有大量的請求被包裝成事務,在向 MySQL 伺服器發起事務處理請求。而每條事務至少一條 SQL ,最多很多 SQL ,這樣如果大家都存取同樣的表資料,在不加保護的情況,就絕對會出現問題。甚至,因為事務由多條 SQL 構成,那麼,也會存在執行到一半出錯或者不想再執行的情況,那麼已經執行的怎麼辦呢?

所以,一個完整的事務,絕對不是簡單的 sql 集合,還需要滿足如下四個屬性:

  • 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
  • 一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
  • 隔離性:資料庫允許多個並行事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務並行執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交( Read uncommitted )、讀提交( read committed )、可重複讀( repeatable read )和序列化( Serializable )
  • 永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失

1.2 事務的提交

事務的提交方式常見的有兩種:

  • 自動提交
  • 手動提交

檢視事務提交方式

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.41 sec)

用 SET 來改變 MySQL 的自動提交模式

mysql> SET AUTOCOMMIT=0; #SET AUTOCOMMIT=0 禁止自動提交
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT=1; #SET AUTOCOMMIT=1 開啟自動提交
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)

1.3 事務的常見操作

開啟事務:start transaction;

執行多條SQL語句

回滾或提交:rollback/commit;

說明:rollback即是全部失敗,commit即是全部成功

2 事務隔離

2.1 事務並行時出現的問題

髒讀(第一個事務修改資料但沒有提交,第二個事務就讀取,在第一個事務回滾後,第二個事務讀取的就是髒資料)

不可重複讀(一個事務兩次讀取資料,中間有另一個事務修改,第一個事務兩次讀取的資料就不同)

幻讀 一個事務兩次讀取,中間有另一個事務執行了插入操作,造成第一個事務看到不同的結果

2.2 事務隔離級別

讀未提交(Read Uncommitted): 在該隔離級別,所有的事務都可以看到其他事務沒有提交的執行結果。(實際生產中不可能使用這種隔離級別的),但是相當於沒有任何隔離性,也會有很多並行問題,如髒讀,幻讀,不可重複讀等,我們上面為了做實驗方便,用的就是這個隔離性。

讀提交(Read Committed) :該隔離級別是大多數資料庫的預設的隔離級別(不是 MySQL 預設的)。它滿足了隔離的簡單定義:一個事務只能看到其他的已經提交的事務所做的改變。這種隔離級別會引起不可重複讀,即一個事務執行時,如果多次 select, 可能得到不同的結果。

可重複讀(Repeatable Read): 這是 MySQL 預設的隔離級別,它確保同一個事務,在執行中,多次讀取運算元據時,會看到同樣的資料行。但是會有幻讀問題。

序列化(Serializable): 這是事務的最高隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決了幻讀的問題。它在每個讀的資料行上面加上共用鎖。但是可能會導致超時和鎖競爭(這種隔離級別太極端,實際生產基本不使用)

隔離級別髒讀不可重複讀幻讀
讀未提交×××
讀提交××
可重複讀×
序列化

到此這篇關於MySQL資料庫事務原理及應用的文章就介紹到這了,更多相關MySQL資料庫事務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com