SQL的事務

一、基本概念

  1. 事務是數據庫區別于文件系統的重要特性之一,當有了事務 , 就可以讓數據庫始終保持一致性 , 同時可以通過事務的機制恢復到某個時間點,保證了提交到數據庫的修改不會因為系統崩潰而丟失;
  2. 事務只是一個改變 , 是一些操作的集合,用專業術語說,就是一組邏輯操作單元 。事務本身不具備四個特性,而是通過某些手段盡可能讓執行單元滿足四個特性 , 那么此時稱之為一個完整的事務 。
經常在網絡上、現實中一提到事務就綁死ACID四個特性,但實際ACID不僅在事務中有體現,還可以涵蓋各個領域 。
二、事務處理的原則所有的事務都是作為一組邏輯操作單元來執行 , 即使出現故障 , 都不能改變這種方式 。當在一個事務中執行多個操作時,要么事務提交(commit),所有修改都會永久地保存下來;要么事務回滾(rollback) , 所有修改都放棄,一切回歸最初狀態 。
常見例子:
A給B轉賬,A余額減少,B余額增加 , 這是一套必須同時完成的操作 , 如果其中一個失敗了,則所有操作都會失敗 。
在SQL中體現為:
UPDATE account SET money = money - 100 WHERE name = 'A';UPDATE account SET money = money + 100 WHERE name = 'B';這兩句SQL語句就必須同時完成,或同時失敗 。
三、ACID
  • 原子性(atomicity):指事務是不可分割的工作單位,要么全部提交,要么全部回滾 。
    原子就是物理世界中最小的單位了,無法在繼續分下去了,表達的是一個整體性的概念 。
  • 一致性(consistency):在事務執行前后,數據從一個合法性狀態轉換到另一個合法性狀態 , 這種狀態是語義上的,不同的業務場景,對于合法性狀態有不同的定義 。
    可以理解為滿足預定結果的狀態稱為合法的狀態,這種狀態由自己定義,比如現實世界中的約束 。如果滿足這種狀態,那就是滿足一致性 , 如果不滿足,這操作失敗,事務回滾 。
    比如余額字段設置為無符號數值 , 即錢是不允許負數的,如果此時SQL語句修改余額小于0,此時就不滿足定義的語義,所以SQL會執行失敗(顯示出來就是報錯),事務就會回滾 。
  • 隔離性(isolation):
    指事務的執行不能被其它事務干擾 , 即一個事務內部的操作及使用的數據對并發的其它事務都是隔離的、獨立的,并發執行的各個事務之間不能互相干擾 。
    比如事務A把余額從0改成100了,此時事務A還沒有commit,而事務B進來讀取余額了,此時結果是0還是100?這個時候就引出隔離級別這個概念了 。
  • 持久性(durability):
    指事務一旦提交(commit),對數據的改變就是永久性的,之后的其它操作丟不會對其有任何影響 。
    比如A給B轉賬100,A減去100,B增加100 , 然后事務提交 , A與B的余額就都是修改后的了,如果此時A反悔不轉錢了,是無法做到的,只能再開個事務讓B給A轉回去 。
    持久性是通過事務日志來保證的 , 日志包括重做日志(redo)、回滾日志(undo) 。當通過事務對數據進行修改時 , 首先會將數據庫的變化信息記錄到redo日志中,然后再對數據庫對應的行進行修改,這樣的話即使數據庫崩潰,重啟后也能找到沒有更新到數據庫系統的redo日志重新執行,從而使事務具有持久性
總結:在ACID中,原子性是基??,隔离性是手段,一譃丛矢`際跫?nbsp;, 持久性是最終的目的 。
如果要一句話回答事務是什么?那就是保證原子性、一致性隔離性,持久性的一個或多個數據庫操作稱為一個事務 。
四、事務的狀態