如何理解事務?

2021-10-06 23:51:06 字數 1741 閱讀 9481

一件事從開始發生到結束的整個過程。在mysql裡事務是一組不可被分割執行的sql語句集合,如果有必要,可以撤銷。 這樣可以確保資料的一致性。rollback事物回滾,則事物執行失敗,保證了資料安全。

mysql中預設sql語句會自動commit到資料庫,在預設情況下mysql開啟的是autocommit模式,也就是隱含的將每條語句當做乙個事務處理,每條sql都會被自動提交。

事務的機制(acid):

事務的機制通常被概括為「acid」原則即原子性(a)、穩定性(c)、隔離性(i)和永續性(d)。

原子性:構成事務的的所有操作必須是乙個邏輯單元,要麼全部執行,要麼全部不執行。

穩定性:資料庫在事務執行前後狀態都必須是穩定的。

隔離性:事務之間不會相互影響。

永續性:事務執行成功後必須全部寫入磁碟。

事務的併發問題

1、髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料

2、不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。

3、幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

為了避免上面出現的幾種情況,在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同。

讀未提交(read uncommitted):只處理更新丟失。如果乙個事務已經開始寫資料,則不允許其他事務同時進行寫操作,但允許其他事務讀此行資料。可通過「排他寫鎖」實現。

讀提交(read committed):處理更新丟失、髒讀。讀取資料的事務允許其他事務繼續訪問改行資料,但是未提交的寫事務將會禁止其他事務訪問改行。可通過「瞬間共享讀鎖」和「排他寫鎖」實現。

可重複讀取(repeatable read):處理更新丟失、髒讀和不可重複讀取。讀取資料的事務將會禁止寫事務,但允許讀事務,寫事務則禁止任何其他事務。可通過「共享讀鎖」和「排他寫鎖」實現。

序列化(serializable):提供嚴格的事務隔離。要求失去序列化執行,事務只能乙個接乙個地執行,不能併發執行。僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

隔離級別越高,越能保證資料的完整性和統一性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免髒讀,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

事務有七大傳播機制required(預設):支援使用當前事務,如果當前事務不存在,建立乙個新事務。

supports:支援使用當前事務,如果當前事務不存在,則不使用事務。

mandatory:中文翻譯為強制,支援使用當前事務,如果當前事務不存在,則丟擲exception。

requires_new:建立乙個新事務,如果當前事務存在,把當前事務掛起。

not_supported:無事務執行,如果當前事務存在,把當前事務掛起。

never:無事務執行,如果當前有事務則丟擲exception。

nested:巢狀事務,如果當前事務存在,那麼在巢狀的事務中執行。如果當前事務不存在,則表現跟required一樣。

理解事務的隔離性

理解事務的隔離性 事務是以可控的方式對資料資源進行訪問的一組操作。其屬性包括原子性 一致性 隔離性和永續性,也就是常說的acid。其中,隔離性是針對資料資源的併發訪問,規定了各個事務之間相互影響的程度。個人認為這是事務的4個特性裡面,比較難理解的乙個。事實上,事務的隔離性可以分為4種型別的隔離級別 ...

mysql筆記 七 白話理解事務

今天我們學習web開發級mysql顛覆實戰課程第9課沒mysql事務 一 白話理解事務。前面有兩節課第7講 商品系統設計 四 商品屬性設計之自定義屬性,第8講 商品系統設計 五 一維屬性的商品 表設計的筆記本人省略,沒有原因,個人愛好。所謂事務,用老師白話理解就是 1 不止要執行乙個步驟。2 這些步...

理解事務的ACID和隔離級別

事務 transaction 是訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 事務是乙個資料庫概念。但我理解資料庫也是一款軟體,只是遵循了資料庫sql標準,理解事務,先看看資料庫軟體的邏輯結構,這是mysql的邏輯結構 可見mysql支援多客戶端訪問,對應到mysql裡面就是多執行緒...