寫在前面:
在計算機語言中,一般指訪問並更新資料庫中的乙個程式執行單元。 事務具有的四個特點,稱為acid。在資料庫的併發訪問中,為了保證資料的讀取正確性,設定的事務的隔離級別。
例如: abcde五個賬戶,每個賬戶有100元,共計500元,a給b轉賬10元,b給c轉賬5元,c給d轉賬5元,d給e轉賬10元,e給a轉賬10元,當轉賬同時進行,模擬併發運算元據庫,最後5個賬戶的總額度仍舊應該是500元。
(1)髒讀(dirty read):a讀取b事務尚未提交的事務,並修改了b的資料,然後b對事務執行回滾,那麼a讀取到的資料為臟讀。
時間事務a
事務bt1
事務開始
t2事務開始
t3查詢賬戶餘額=500元
t4賬戶+500元
t5a查詢到賬戶資料為1000元(髒讀)
t6a取出200元
t7回滾事務
t8提交事務
(2)不可重複讀(unrepeatable read):事務a讀取資料,然後事務b對事務a的資料進行了修改,此後,事務a再次讀取資料,這時為不可重複讀,最後a提交事務。所以在a的一次事務中,兩次讀取到的資料不一致。
時間事務a
事務bt1
事務開始
t2事務開始
t3讀取賬戶餘額=1000元
t4讀取賬戶餘額=1000元
t5賬戶+500元
t6提交事務
t7讀取賬戶餘額=1500元(不可重複讀)
(3)幻讀(phantom read):事務a查詢資料,查詢一切符合查詢條件的行,這時b新增加乙個行資料,a事務再次查詢時,發現與第一次查詢相比,新增加了一行。
時間事務a
事務bt1
開始事務
t2開始事務
t3查詢所有符合條件賬戶=100的行
t4新增加乙個賬戶行,並且賬戶=100
t5提交事務
t6再次查詢所有符合條件賬戶=100的行
在看過了上面資料併發訪問時可能產生的問題,在有些場景下可能是允許的,但是有些場景下可能就是致命的,資料庫通常會通過鎖機制來解決資料併發訪問問題,按鎖定物件不同可以分為表級鎖和行級鎖;按併發事務鎖定關係可以分為共享鎖和獨佔鎖。
直接使用鎖是非常麻煩的,為此資料庫為使用者提供了自動鎖機制,只要使用者指定會話的事務隔離級別,資料庫就會通過分析sql語句然後為事務訪問的資源加上合適的鎖。
事務的隔離級別有4個,由低到高分別為:read uncommited ,read commited ,reapeatable read ,serializable,他們分別可以解決以上在併發訪問資料庫時所產生的髒讀,不可重複讀,幻讀等執行緒安全問題。
✔️表示允許,❌表示不允許
隔離級別
髒讀不可重複讀
幻讀read uncommited
✔️✔️
✔️read commited❌✔️
✔️reapeatable read❌❌
✔️serializable❌❌
❌注:serializable是最高的隔離級別,可以全部避免髒讀,不可重複讀,幻讀等問題,但效率偏低,花費較大,一般不使用。
資料庫 ACID及事務隔離級別
事務 併發控制和恢復的基本單位。atomicity原子性 事務是資料庫的邏輯工作單位,事務中包括的所有操作要麼都做,要麼什麼都不做。consistency一致性 事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。例如對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束後accoun...
資料庫(一) ACID,事務,隔離級別
事務 transaction 最簡單的理解就是多個對資料庫操作的有序組合。舉例來說,多個順序執行的sql語句就構成了乙個事務。在現實中,對於資料庫的資料操作,基本以事務為基本單位。最常見的例子,轉賬時,a賬戶扣掉100,b賬戶增加100,這些操作,都是需要至少兩個以上的sql語句來完成的。從資料庫操...
資料庫事務的ACID特性和隔離級別
資料庫事務 transaction 是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。一方面,當多個應用程式併發訪問資料庫時,事務可以在應用程式間提供乙個隔離方法,防止互相干擾。另一方面,事務為資料庫操作序列提供了乙個從失敗恢復正常的方法。事務具有四個特性 原子性 atom...