MySQL中的事務

2022-06-04 08:27:05 字數 2314 閱讀 2347

資料庫事務

事務指的是滿足 acid 特性的一系列操作。在資料庫中,可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。

在 mysql 中只有使用了 innodb 資料庫引擎的資料庫或表才支援事務。

1、用 begin, rollback, commit來實現

2、直接用 set 來改變 mysql 的自動提交模式:

acid

事務必須具備acid四個特性: atomicity(原子性)、consistency(一致性)、isolation(隔離性)、durability(永續性)

事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。

資料庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對乙個資料的讀取結果都是相同的。

乙個事務所做的修改在最終提交以前,對其它事務是不可見的。

一旦事務提交,則其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。可以通過資料庫備份和恢復來保證永續性。

mysql 預設採用自動提交模式。也就是說,如果不顯示使用start transaction語句來開始乙個事務,那麼每個查詢都會被當做乙個事務自動提交。

原子性(atomicity)

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。

想要保證事務的原子性,就需要在異常發生時,對已經執行的操作進行回滾,而在 mysql 中,恢復機制是通過回滾日誌(undo log)實現的,所有事務進行的修改都會先記錄到這個回滾日誌中,然後在對資料庫中的對應行進行寫入。

這個過程其實非常好理解,為了能夠在發生錯誤時撤銷之前的全部操作,肯定是需要將之前的操作都記錄下來的,這樣在發生錯誤時才可以回滾。

回滾日誌除了能夠在發生錯誤或者使用者執行rollback時提供回滾相關的資訊,它還能夠在整個系統發生崩潰、資料庫程序直接被殺死後,當使用者再次啟動資料庫程序時,還能夠立刻通過查詢回滾日誌將之前未完成的事務進行回滾,這也就需要回滾日誌必須先於資料持久化到磁碟上,是我們需要先寫日誌後寫資料庫的主要原因。

回滾日誌並不能將資料庫物理地恢復到執行語句或者事務之前的樣子;它是邏輯日誌,當回滾日誌被使用時,它只會按照日誌邏輯地將資料庫中的修改撤銷掉看,可以理解為,我們在事務中使用的每一條insert都對應了一條delete,每一條update也都對應一條相反的update語句。

一致性(consistency)

一致性是指事務必須使資料庫從乙個一致的狀態變到另外乙個一致的狀態,也就是執行事務之前和之後的狀態都必須處於一致的狀態。

在事務t開始時,此時資料庫有一種狀態,這個狀態是所有的mysql物件處於一致的狀態,例如資料庫完整性約束正確,日誌狀態一致等,當事務t提交後,這時資料庫又有了乙個新的狀態,不同的資料,不同的索引,不同的日誌等,但此時,約束,資料,索引,日誌等mysql各種物件還是要保持一致性(正確性)。 這就是 從乙個一致性的狀態,變到另乙個一致性的狀態。也就是事務執行後,並沒有破壞資料庫的完整性約束(一切都是對的)。

隔離性(isolation)

隔離性是指當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離

即要達到這麼一種效果:對於任意兩個併發的事務t1和t2,在事務t1看來,t2要麼在t1開始之前就已經結束,要麼在t1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。

永續性(durability)

一旦事務被提交,那麼資料一定會被寫入到資料庫中並持久儲存起來,即便是在資料庫系統遭遇到故障的情況下也不會丟失提交事務的操作。

與原子性一樣,事務的永續性也是通過日誌來實現的,mysql 使用重做日誌(redo log)實現事務的永續性,重做日誌由兩部分組成,一是記憶體中的重做日誌緩衝區,因為重做日誌緩衝區在記憶體中,所以它是易失的,另乙個就是在磁碟上的重做日誌檔案,它是持久的。

當我們在乙個事務中嘗試對資料進行修改時,它會先將資料從磁碟讀入記憶體,並更新記憶體中快取的資料,然後生成一條重做日誌並寫入重做日誌快取,當事務真正提交時,mysql 會將重做日誌快取中的內容重新整理到重做日誌檔案,再將記憶體中的資料更新到磁碟上。

在 innodb 中,重做日誌都是以 512 位元組的塊的形式進行儲存的,同時因為塊的大小與磁碟扇區大小相同,所以重做日誌的寫入可以保證原子性,不會由於機器斷電導致重做日誌僅寫入一半並留下髒資料。

除了所有對資料庫的修改會產生重做日誌,因為回滾日誌也是需要持久儲存的,它們也會建立對應的重做日誌,在發生錯誤後,資料庫重啟時會從重做日誌中找出未被更新到資料庫磁碟中的日誌重新執行以滿足事務的永續性。

mysql中事務的特性 mysql中事務的四大特性

原子性 atomicity 事務就像 原子 一樣,不可被分割,組成事務的dml操作語句要麼全成功,要麼全失敗,不可能出現部分成功部分失敗的情況。一致性 consistency 一旦事務完成,不管是成功的,還是失敗的,整個系統處於資料一致的狀態。隔離性 isolation 乙個事務的執行不會被另乙個事...

mysql中的事務和鎖 MySQL中的事務和鎖

鎖 行級鎖select for update nowaitfalse,skip false 注意必須用在事物裡面 所有匹配的行將被鎖定,知道事務結束。這意味著可以通過鎖防止資料被其他事務修改。一般情況下如果其他事務鎖定了相關行,那麼本查詢將被阻塞,直到鎖被釋放。事務事務的四大特性 1.原子性 事務包...

MySql中的事務

一.mysql的事務支援不是繫結在mysql伺服器本身,而是與儲存引擎相關 1.myisam 不支援事務,用於唯讀程式提高效能 2.innodb 支援acid事務 行級鎖 併發 二.乙個事務是乙個連續的一組資料庫操作,就好像它是乙個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單...