手把手教你配置redis密碼
什麼是事務
事務就是【一組原子性的SQL查詢】,或者說一個獨立的工作單元。如果資料庫引擎能夠成功地對資料庫應用該組查詢的全部語句,那麼就執行該組查詢。
如果其中有任何一條語句因為崩潰或其他原因無法執行,那麼所有的語句都不會執行。也就是說,事務內的語句,要麼全部執行成功,要麼全部執行失敗。
事務控制語法
BEGIN 或 START TRANSACTION 顯式地開啟一個事務;
COMMIT / COMMIT WORK二者是等價的。提交事務,並使已對資料庫進行的所有修改成為永久性的;
ROLLBACK / ROLLBACK WORK。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改;
SAVEPOINT identifier 在事務中建立一個儲存點,一個事務中可以有多個 SAVEPOINT;
ROLLBACK TO identifier 把事務回滾到標記點;
SET TRANSACTION 用來設定事務的隔離級別。InnoDB 儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE
事務的ACID特性
原子性(atomicity)
一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。
一致性(consistency)
隔離性(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官方手冊