數據庫 事務及特性 隔離機制 引擎

事務

**1.事務的概念:
事務是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的單位。**例如在關係型數據庫中,一個事務可以是一條sql語句、一組sql語句或整個程序。

2.事務的ACID(事務管理)特性
(1)原子性
事務是數據庫的邏輯工作單位,事務中包括的諸操作要麼都做,要麼都不做。
(2)一致性
事務的執行結果必須是使數據庫從一個一致性狀態轉換到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性裝狀態。
(3)隔離性
一個事務的執行不能被其他的事務干擾。即一個事務的內部操作及使用的數據對其他併發操作事務是隔離的,併發執行的各個事務之間不能互相干擾。
(4)持續性
持續性也稱爲永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行的結果有任何影響。
3.並行事務的四大問題:
(1)更新丟失:和別的事務讀到相同的東西,各自寫,自己的寫被覆蓋了。(誰寫的快誰的更新就丟失了)
(2)髒讀:讀到別的事務未提交的數據。(萬一回滾,數據就是髒的無效的了)
(3)不可重複讀:兩次讀之間有別的事務修改。
4)幻讀:兩次讀之間有別的事務增刪。

應隔離級別

**1.READ UNCOMMITTED:**讀未提交,不解決任何問題。
**2.READ COMMITTED:**讀已提交,只讀提交的數據,無髒讀;
**3.REPEATABLE READ:**可重複讀,加行鎖,兩次讀之間不會有修改,無髒讀無重複讀;
**4.SERIALIZABLE:** 串行化,加表鎖,全部串行,無所有問題。

在這裏插入圖片描述

  1.READ UNCIMMITTED(未提交讀)
  事務還沒提交,而別的事務可以看到他其中修改的數據的後果,也就是髒讀。

  2.READ COMMITTED(提交讀)
  首先大多數數據庫系統的默認隔離級別是READ COMMITTED,這種隔離級別就是一個事務的開始,只能看到已經完成的事務的結果,正在執行的,是無法被其他事務看到的。這種級別會出現讀取舊數據的現象

  3.REPEATABLE READ(可重複讀)
   REPEATABLE READ解決了髒讀的問題,該級別保證了每行的記錄的結果是一致的,也就是上面說的讀了舊數據的問題,但是卻無法解決另一個問題,幻行,顧名思義就是突然蹦出來的行數據。指的就是某個事務在讀取某個範圍的數據,但是另一個事務又向這個範圍的數據去插入數據,導致多次讀取的時候,數據的行數不一致。

總結:雖然讀取同一條數據可以保證一致性,但是卻不能保證沒有插入新的數據。

下面是各個隔離級別的原理:參考博客https://blog.csdn.net/chenyiminnanjing/article/details/82714341

READ_UNCOMMITED 的原理:
1,事務對當前被讀取的數據不加鎖;
2,事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放。
下面分別對應上面1,2產生的表現:
1,事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,能讀到事務2對該記錄的修改版本,即使該修改尚未被提交。
2,事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。
READ_COMMITED 的原理:
1,事務對當前被讀取的數據加 行級共享鎖(當讀到時才加鎖),一旦讀完該行,立即釋放該行級共享鎖;
2,事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放。
表現:
1,事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,讀到的只能是事務2對其更新前的版本,要不就是事務2提交後的版本。
2,事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。
REPEATABLE READ 的原理:
1,事務在讀取某數據的瞬間(就是開始讀取的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放;
2,事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放。
表現:
1,事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,讀到的仍然是第一次讀取的那個版本。
2,事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。
SERIALIZABLE 的原理:
1,事務在讀取數據時,必須先對其加 表級共享鎖 ,直到事務結束才釋放;
2,事務在更新數據時,必須先對其加 表級排他鎖 ,直到事務結束才釋放。
表現:
1,事務1正在讀取A表中的記錄時,則事務2也能讀取A表,但不能對A表做更新、新增、刪除,直到事務1結束。
2,事務1正在更新A表中的記錄時,則事務2不能讀取A表的任意記錄,更不可能對A表做更新、新增、刪除,直到事務1結束。
先寫到這裏,後面還會對其中提到的鎖進行解釋。

引擎

參考這篇文章:
https://blog.csdn.net/mrleeapple/article/details/80526034

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章