數據庫中事務指的是什么


1.事務概念

事務是數據庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操作;這些操作作為一個整體一起向系統提交,要么都執行、要么都不執行;事務是一組不可再分割的操作集合(工作邏輯單元);

事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個事務。事務一般都是與數據庫打交道的操作.

事務就是被綁定在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。

2.事務的四大特性

1 )原子性 
事務是數據庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做 
2 )一致性 
事 務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。如果數據庫系統 運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是 不一致的狀態。 
3 )隔離性 
一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它並發事務是隔離的,並發執行的各個事務之間不能互相干擾。 
4 )持續性 
也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。 

3.事務的隔離級別

數據庫事務的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決臟讀、不可重復讀、幻讀這幾類問題。

1)讀未提交(Read Uncommitted)
引發臟讀(讀取了未提交的數據)
2)讀已提交(Read Committed)
這是大多數數據庫系統默認的隔離級別,但不是MySQL默認的
只能看見已經提交事務所做的改變
引發不可重復讀,不可重讀讀意味着我們同一事務執行完全相同的select語句時可能看到不一樣的結果。
導致這種情況的原因可能有:(1)有一個交叉的事務有新的commit,導致了數據的改變;(2)一個數據庫被多個實例操作時,同一事務的其他實例在該實例處理其間可能會有新的commit
多個commit提交時,只讀一次出現結果不一致

3)可重復讀(Repeatable Read)
這是MySQL的默認事務隔離級別
它確保同一事務的多個實例在並發讀取數據時,看到同樣的數據行
此級別可能出現的問題--幻讀(Phantom Read),當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行
InnoDB和Falcon存儲引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題
4)可串行化(Serializable)
這是最高的隔離級別
它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它在每個讀的數據行上加上共享鎖。
可能導致大量的超時現象和鎖競爭

 

 

4.事務的7種傳播行為

1)PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。

2)PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。‘

3)PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。

4)PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。

5)PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

6)PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。

7)PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM