1. 程式人生 > 實用技巧 >關於ext4檔案系統概述

關於ext4檔案系統概述

什麼是事務

事務就是【一組原子性的SQL查詢】,或者說一個獨立的工作單元。如果資料庫引擎能夠成功地對資料庫應用該組查詢的全部語句,那麼就執行該組查詢。
如果其中有任何一條語句因為崩潰或其他原因無法執行,那麼所有的語句都不會執行。也就是說,事務內的語句,要麼全部執行成功,要麼全部執行失敗。

事務控制語法

BEGIN 或 START TRANSACTION 顯式地開啟一個事務;
COMMIT / COMMIT WORK二者是等價的。提交事務,並使已對資料庫進行的所有修改成為永久性的;
ROLLBACK / ROLLBACK WORK。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改;
SAVEPOINT identifier 在事務中建立一個儲存點,一個事務中可以有多個 SAVEPOINT;
RELEASE SAVEPOINT identifier 刪除一個事務的儲存點;
ROLLBACK TO identifier 把事務回滾到標記點;
SET TRANSACTION 用來設定事務的隔離級別。InnoDB 儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE

事務的ACID特性

原子性(atomicity)
一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。
一致性(consistency)
資料庫總是從一個一致性的狀態轉換到另外一個一致性的狀態。在前面的例子中,一致性確保了,即使在執行第三、四條語句之間時系統崩潰,CMBC賬戶中也不會損失100萬,不然lemon要哭死,因為事務最終沒有提交,所以事務中所做的修改也不會儲存到資料庫中。
隔離性(isolation)
通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時如果有其他人準備給lemon的CMBC賬戶存錢,那他看到的CMBC賬戶裡還是有100萬的。
永續性(durability)
一旦事務提交,則其所做的修改就會永久儲存到資料庫中。此時即使系統崩潰,修改的資料也不會丟失。永續性是個有點模糊的概念,因為實際上永續性也分很多不同的級別。有些永續性策略能夠提供非常強的安全保障,而有些則未必。而且「不可能有能做到100%的永續性保證的策略」否則還需要備份做什麼。

什麼是髒讀、不可重複讀、幻讀

髒讀

在事務A修改資料之後提交資料之前,這時另一個事務B來讀取資料,如果不加控制,
事務B讀取到A修改過資料,之後A又對資料做了修改再提交,則B讀到的資料是髒資料,此過程稱為髒讀Dirty Read。

時間 事務A 事務B
T1 START TRANSACTION START TRANSACTION
T2 查詢CMBC賬戶餘額100萬
T3 工資入賬100萬,CMBC賬戶餘額200萬
T4 查詢到CMBC賬戶餘額200萬(髒讀)
T5 工資發錯,撤回100萬,賬戶餘額100萬
T6 存入50萬理財金,賬戶餘額修改為250萬
T7 COMMIT
T8 COMMIT

不可重複度

一個事務內在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現其讀出的資料已經發生了變更、或者某些記錄已經被刪除了。

時間 事務A 事務B
T1 START TRANSACTION START TRANSACTION
T2 查詢CMBC賬戶餘額100萬
T3 查詢到CMBC賬戶餘額100萬
T4 存入50萬理財金,賬戶餘額修改為150萬
T5 COMMIT提交事務
T6 查詢CMBC賬戶餘額150萬(不可重複讀)
T7
T8 COMMIT

幻讀

事務A在按查詢條件讀取某個範圍的記錄時,事務B又在該範圍內插入了新的滿足條件的記錄,當事務A再次按條件查詢記錄時,會產生新的滿足條件的記錄(幻行 Phantom Row)

時間 事務A 事務B
T1 START TRANSACTION START TRANSACTION
T2 查詢CMBC賬戶今天交易詳情,返回2條交易記錄
T3 存入50萬理財金,交易記錄加1
T4
T5 COMMIT提交事務
T6 查詢CMBC賬戶今天交易詳情,返回3條記錄(幻讀)
T7
T8 COMMIT
不可重複讀與幻讀區別?
  • 不可重複讀的重點是修改:在同一事務中,同樣的條件,第一次讀的資料和第二次讀的【資料不一樣】。(因為中間有其他事務提交了修改)
  • 幻讀的重點在於新增或者刪除:在同一事務中,同樣的條件,第一次和第二次讀出來的【記錄數不一樣】。(因為中間有其他事務提交了插入/刪除)

四個隔離級別

事務隔離級別 特點 髒讀 不可重複讀 幻讀
Read Uncommited 所有事務都可以看到其他事務未提交的修改 YES YES YES
Read Commited 一個事務只能看到其他已經提交的事務所做的變更 NO YES YES
Repeatable Read 確保同一事務的多個例項在併發讀取資料時會看到相同的資料行 NO NO YES
Serializable 最高的隔離級別,完全序列化讀,事務序列執行,讀取每一行資料都加鎖,會導致大量的超時和鎖爭用問題. NO NO NO

MySQL中哪些儲存引擎支援事務

MySQL中InnoDB和NDB Cluster儲存引擎提供了事務處理能力,以及其他支援事務的第三引擎。

自動提交

MySQL預設採用自動提交AUTOCOMMIT模式。也就是說,如果不是顯式地開始一個事務,則每個查詢都被當作一個事務執行提交操作。
對於MyISAM或者記憶體表示這些事務型的表,修改AUTOCOMMIT不會有任何影響。對這類表來說,沒有COMMIT或者ROLLBACK的概念,也可以說是相當於一直處於AUTOCOMMIT啟用的模式

MySQL儲存引擎型別有哪些

最常用的儲存引擎是InnoDB引擎和MyISAM儲存引擎,InnoDB是MySQL的預設事務引擎。
檢視資料庫當前支援的引擎:

show table status from 'your_db_name' where name='your_table_name';
查詢結果表中的'Engine'欄位指示儲存引擎型別。

InnoDB儲存引擎的特點和應用場景

InnoDB是MySQL的預設【事務引擎】,被設定用來處理大量短期(short-lived)事務,短期事務大部分情況是正常提交的,很少會回滾。
參考MySQL官方手冊 https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-model.html