1. 程式人生 > 遊戲 >《戰地2042》獨立短片電影“離去”公佈

《戰地2042》獨立短片電影“離去”公佈

一、事務定義

  事務:一個最小的不可再分的工作單元;通常一個事務對應一個完整的業務(例如銀行賬戶轉賬業務,該業務就是一個最小的工作單元);一個完整的業務需要批量的DML(insert、update、delete)語句共同聯合完成,事務只和DML語句有關,或者說DML語句才有事務。這個和業務邏輯有關,業務邏輯不同,DML語句的個數不同

二、事務四大特徵(ACID)

  • A(atomicity)原子性:一個事務必須被視為一個不可分割的最小單位,要不全部提交成功,要麼全部失敗回滾。
  • C(consistency)一致性:資料庫總是從一個一致性的狀態轉換到另外一個一致性狀態,不會部分資料狀態改變了部分狀態沒有改變。
  • I(isolation)隔離性:通常來說,一個事務所做的修改在最終提交之前,對其他事務是不可見的。這個和資料庫的隔離級別有關,所以只能通常來說。
  • D(durability)永續性:一旦事務提交,則其所做的修改會被永久儲存到資料庫中。


三、實現方式

原子性:原子性是通過undo log日誌進行實現的。當事務需要回滾時,InnoDB引擎就會呼叫undo log進行SQL語句的撤銷,實現資料的回滾。undo log是InnoDB引擎提供的日誌。當事務對資料庫進行修改,InnoDB不僅會記錄redo log,還會生成對應的undo log。如果事務執行失敗或呼叫了rollback,導致事務需要回滾,就可以利用undo log中的資訊將資料回滾到修改之前的樣子。但是undo log於redo log不同,它屬於邏輯日誌。它對SQL語句執行相關的資訊進行記錄。當發生回滾時,InnoDB引擎會根據undo log日誌中的鉅鹿做與之前相反的工作。比如對於每個資料的插入操作(insert),回滾時會執行資料刪除操(delete);對於每個資料刪除操作(delete),回滾時會執行資料插入操作(insert);對於每個資料更新操作(update),回滾時會執行一個相反的資料更新操作(update),把資料改回去。undo log有兩個作用,一是提供回滾,二是實現MVCC功能。
永續性

:事務的永續性是通過InnoDB儲存引擎中的redo log日誌來實現的。重做日誌(redo log)是InnoDB引擎層的日誌,用來記錄事務操作引起資料的變化,記錄的是資料頁的物理修改。InnoDB引擎對資料的更新,是先將更新記錄寫入redo log日誌,然後會在系統空閒的時候或者是按照設定的更新策略再將日誌中的內容更新到磁碟之中。這就是所謂的預寫式技術(Write Ahead logging)。這種技術可以大大減少IO操作的頻率,提升資料重新整理的效率。redo log有一些細節需要我們注意,redo log日誌的大小是固定的,為了能夠持續不斷的對更新記錄進行寫入,在redo log日誌中設定了兩個標誌位置,checkpoint和write_pos,分別表示記錄擦除的位置和記錄寫入的位置。這種結構很像一個迴圈佇列:

隔離性:事務之間的隔離,是通過鎖機制實現的。當一個事務需要對資料庫中的某行資料進行修改時,需要先給資料加鎖。加了鎖的資料,其它事務是不執行操作的,只能等待當前事務提交或回滾將鎖釋放。鎖機制並不是一個陌生的概念,在許多場景中都會利用到不同實現的鎖對資料進行保護和同步。而在MySQL中,根據不同的劃分標準,還可將鎖分為不同的種類:
      a 粒度劃分:行鎖、表鎖、頁鎖

      MySQL中不同的儲存引擎能夠支援的鎖也是不一樣的。MyISAM只支援表鎖,而InnoDB同時支援表鎖和行鎖,且出於效能考慮,絕大多數情況下使用的都是行鎖。InnoDB 行鎖是通過給索引項加鎖實現的,如果沒有索引,InnoDB會通過隱藏的聚簇索引來對記錄加鎖。也就是說,如果不通過索引條件檢索資料,那麼InnoDB將對錶中所有資料加鎖,實際效果跟表鎖一樣。因為沒有了索引,找到某一條記錄就得掃描全表,要掃描全表,就得鎖定表。


      b 使用方式劃分:共享鎖、排他鎖

      共享鎖又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是隻能讀不能修改。排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖。獲取排他鎖的事務是可以對資料就行讀取和修改。

      c 思想劃分:悲觀鎖、樂觀鎖
      悲觀鎖(Pessimistic Concurrency Control),正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。樂觀鎖( Optimistic Locking ) 相對悲觀鎖而言,樂觀鎖假設認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。樂觀鎖通常使用版本標識方法來實現,比如MVCC。

一致性: 一致性是指事務執行結束後,資料庫的完整性約束沒有被破壞,事務執行的前後都是合法的資料狀態。一致性是事務追求的最終目標,原子性、永續性和隔離性,實際上都是為了保證資料庫狀態的一致性而存在的。