什麼是事務
數據庫事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列讀或寫操作。其目的是提供三種方法:失敗恢復到正常狀態的方法、保持一致性的方法、併發操作之間保持隔離的方法,通俗的說是那一系列操作要麼完全地執行,要麼完全地不執行。
事務的ACID特性
- A:原子性(Actomicity),該系列操作作爲一個整體,不能被分割,要麼全執行,要麼都不執行;
- C:一致性(Consistency),確保數據從一種狀態變爲另一種狀態;
- I:隔離性(Isolation),多個事務併發執行時,彼此之間互不影響;
- D:持久性(Durability),當事務提交成功後,對數據的修改要永久保存在數據庫中。
併發異常類型
- 回滾丟失: 由於一個事務的失敗回滾導致另一個事務的更新丟失了;
- 覆蓋丟失: 更新被其他事務給覆蓋了;
- 髒讀: 一個事務讀取了另一個事務修改未提交的數據;
- 不可重複讀: 一個事務對同一行數據執行了兩次或更多次查詢,但是卻得到了不同的結果;
- 幻讀: 與不可重複讀相似,不過針對的是數據的數量,當一個事務查詢記錄兩次或多次時,得到的數量不一致。
事務隔離級別
-
讀未提交: 一個事務的更新語句沒有提交,但是別的事務可以讀到這個改變;
-
讀已提交: 一個事務只能看到其他事務已經提交的更新、看不到未提交的更新,消除了髒讀和回滾丟失,Oracle/Sqlserver就是此類;
-
可重複讀: 一個事務中進行兩次或多次同樣的對於數據內容的查詢,得到的結果是一樣的,但不保證對於數據條數的查詢是一樣的,只要存在讀改行數據就禁止寫,消除了不可重複讀和覆蓋丟失。
-
串行化: 事務執行不允許其他事務操作,只要存在讀就禁止寫,但可以同時讀,消除了幻讀,但是效率太低。
隔離級別 回滾丟失 髒讀 不可重複讀 覆蓋丟失 幻讀 讀未提交 否 否 否 否 否 讀已提交 是 是 否 否 否 可重複讀 是 是 是 是 否 串行化 是 是 是 是 是