Ⅰ 什麼是資料庫事務
資料庫事務(簡稱:事務)是資料庫管理系統執行過程中的一個邏輯單位,由一個有限的資料庫操作序列構成。
一個資料庫事務通常包含了一個序列的對資料庫的讀/寫操作。它的存在包含有以下兩個目的:
為資料庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。
當多個應用程序在並發訪問資料庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
當事務被提交給了DBMS(資料庫管理系統),則DBMS(資料庫管理系統)需要確保該事務中的所有操作都成功完成且其結果被永久保存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行。
但在現實情況下,失敗的風險很高。在一個資料庫事務的執行過程中,有可能會遇上事務操作失敗、資料庫系統/操作系統失敗,甚至是存儲介質失敗等情況。這便需要DBMS對一個執行失敗的事務執行恢復操作,將其資料庫狀態恢復到一致狀態(數據的一致性得到保證的狀態)。為了實現將資料庫狀態恢復到一致狀態的功能,DBMS通常需要維護事務日誌以追蹤事務中所有影響資料庫數據的操作。
Ⅱ 「資料庫中的事務」是什麼
資料庫事務(Database Transaction) ,事務是一系列作為一個邏輯單元來執行的操作集合。它是資料庫維護數據一致性的單位,它將資料庫從一致狀態轉變為新的一致狀態,指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。事務是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
Ⅲ 資料庫詳解之事務
究竟什麼是資料庫的事務,為什麼資料庫需要支持事務,為了實現資料庫事務各種資料庫的是如何設計的。還是只談理解,歡迎大家來討論。
1. 資料庫事務是什麼
事務的定義,已經有太多文章寫過,我就不重復了。我理解的事務就是用來保證數據操作符合業務邏輯要求而實現的一系列功能。換句話說,如果資料庫不支持事務,上面業務系統的程序員就需要自己寫代碼保證相關數據處理邏輯的正確性。而資料庫事務就是把一系列保證資料庫處理邏輯正確性的通用功能在資料庫內實現,並且盡量提高效率。
舉個例子,資料庫最開始普及就是在金融業,銀行的存取款場景就是一個最典型的OLTP資料庫場景,而事務就是設計用來保證類似場景的業務邏輯正確性的。
![事務的四個基本特性](https://img-blog.csdnimg.cn/.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)
**原子性**,如果你要給家人轉賬,必須在你的賬戶里扣掉100塊,在家人賬戶里加上100塊,這兩筆操作需要一起完成,業務邏輯才是正確的。但是程序在做修改的時,肯定會有先後順序,試想一下程序扣了你的錢,這個時候程序崩潰了,家人賬戶的錢沒有加上。那這100塊是不是消失了?你是不是要發瘋?那麼,就把這兩筆操作放進一個事務里,通過原子性保證,這兩筆操作要麼都成功,要麼都失敗。這樣才能保證業務邏輯的正確性。
**一致性**,有很多文章講過一致性,但是很多人會把一致性跟原子性混在一起說。事務的一致性指的是指每一個事務必須保證執行之後所有庫內的規則依舊成立。比如內外鍵,constraint,觸發器等。舉例來說,你在儲蓄卡里有100元,理財賬戶里有100元,基金賬戶有100元,那麼你在資產總和里會看到300元,這個300元必須是其他三個賬戶余額加在一起得到的。你在給家人轉帳100元是從儲蓄卡里轉出去了100元,那麼在資料庫上可以通過創建觸發器的方式,當儲蓄卡余額賬戶減100元的同時,把資產總和也同步減去100,不然的話,就會出現邏輯上的錯誤,因為你已經轉走了100塊儲蓄卡余額,實際資產總和應該是200,如果還是300,資料庫狀態就不一致了。所以實現事務的時候,必須要保證相關聯的觸發器以及其他所有的內部規則都執行成功,事務才能算執行成功。如果在減去資產總時出錯,那麼這筆轉帳交易也不能成功。因為這樣資料庫就會進入不一致的狀態。
那麼這里跟原子性的區別到底在哪裡呢?原子性是指個多個用戶指令之間必須作為一個整體完成或失敗,而一致性更多是資料庫內的相關數據規則必須同時完成或失敗。
**持久性**,最容易理解的一個,事務只要提交了,那麼對資料庫的修改就會保存下來不會丟了。簡單來說,只要提交了,資料庫就算崩潰了,重啟之後你剛存的100塊依然在你的賬戶里。
**隔離性**,每個事務相對於其他的事務是有一定獨立性的,不能互相影響。因為資料庫需要支持並發的操作來提高效率。在並發操作時,一定要通過操作之間的隔離來保證業務邏輯的正確性。比如,你轉帳100塊給家人,一系列操作的最後一步可能是輸入驗證碼,這個時候轉帳還沒有完成,但是在資料庫里你的賬戶對應的記錄中已經減去100塊,家人賬戶也加了100塊,就等著驗證碼輸入以後,事務提交,完成操作。那麼,這個時候,家人通過手機銀行能夠查到這100塊么?你的答案可能是不能,因為這樣才符合業務邏輯,因為你的轉帳操作還沒有提交,事務還沒有完成。那麼資料庫就應該保證這兩個並發操作之間具有一定的隔離性。
那麼到底應該隔離到什麼程度呢?隔離性又分為4個等級:由低到高依次為Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(可重復讀取)、Serializable(序列化),這四個級別可以逐個解決臟讀、不可重復讀、幻象讀這幾類問題。這些東西是什麼意思?請有興趣的小夥伴自行網路,很多文章都寫的很清楚。
那麼怎麼理解不同的隔離等級呢,首先要理解並發操作,並發操作就是指有不同的用戶同時對一個數據進行讀、寫操作,那麼在這個過程中,每個用戶應該看到什麼數據才能保證業務邏輯的正確性呢? 如果是前面存取款的場景,我必須看到的是已經存進來的錢,也就是必須是已經提交的事務。而12306刷火車票呢,你可以看到有10張余票,但是在下單的時候告訴你票賣完了,因為同時有10個用戶把票買掉了,你需要重新刷余票,這個也是可以接受的,也就是說我可以讀到一些虛假的余票,這樣在業務上也沒有什麼問題。那麼在設計這兩個不同系統時,就可以選擇不同的事務隔離級別來實現不同的並發效果。不同的隔離等級就是要在系統的並發性和數據邏輯的嚴謹性之間做出的平衡。
2. 資料庫如何實現事務
資料庫實現事務會有多種不同的方式,但基本的原理類似,比如都需要對事務進行統一的編號處理,都需要記錄事務的狀態(是成功了還是失敗了),都需要在數據存儲的層面對事務進行支持,以明確哪些數據是被哪些事務、插入、修改和刪除的。同時還會記錄事務日誌等,對事務進行系統化的管理以實現數據的原子性,一致性和持久性。
要實現事務的隔離性,最基礎的就是通過加鎖機制把並發操作適當的串列化來保證數據操作的正確邏輯。但是為了要保證系統具有良好的並發性能,必須要在實現事務隔離性時需要找到合理的平衡點。大部分資料庫(包括Oracle,MySQL,Postgres在內)在做並發控制的時候都會採用MVCC(多版本並發控制)的機制來保證系統具有較高的並發性,不同資料庫實現MVCC的具體方案也不盡相同,但其基本原理類似。
3. MVCC實現原理
所謂MVCC,就是資料庫中的同一查詢根據相關事務執行的先後順序以及隔離級別的不同,可能會存在不同版本的結果,通過這樣的手段來保證大部分查詢操作不會被修改操作阻塞並保證數據邏輯的正確性。也就是資料庫通過保存多個版本的數據( 歷史 數據)來提高系統的並發查詢能力。簡單來說就是用存儲空間來交換並發能力。下面以Postgres為例介紹一下MVCC的一種實現方式幫助大家理解這個重要的資料庫概念。通過下面的圖來解釋Posrgres里最基本的數據可見性是如何實現多版本控制的。
![在這里插入圖片描述](https://img-blog.csdnimg.cn/.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)
首先,Postgres里的每一個事務都有編號,這里可以簡單理解為時間順序編號,編號越大的事務發生越晚。然後,資料庫里的每一行記錄都會保存創建這條記錄的事務號(Cre),也會在記錄刪除時保存刪除這條記錄的事務號(Exp),換句話說,只要Exp這里一列里記錄了事務編號,就說明這條記錄被刪除了。那麼一個事務應該能看見那些記錄呢?Postgres里每一個事務都會保存一個當前系統的事務快照(Snapshot),這個快照里會保存事務創建時當前系統的最高(最晚)事務編號,以及目前還在進行中的事務編號。那麼如上圖所示的一個事務的快照里最高事務編號為100,目前正在進行的事務有25,50和75。那麼對應左邊數據記錄,這6行數據的可見性就如同標注的一般:
第一行,Cre 30,沒有刪除,在100這個時間點,應該能看到。
第二行,Cre 50,沒有刪除,但是50這個事務還沒有提交,正在進行中,所以看不見。
第三行,Cre 110,沒有刪除,但是100這個時間點110事務還沒有發生,所以看不見。
第四行,Cre 30,Exp 80,在80的時候數據被刪掉了,所以看不見。
第五行,Cre 30,Exp 75,在30的時候被創建,75時候被刪掉了,但是75這個事務在100的時候還沒有提交,所以這條記錄在100的時候還沒有刪掉,所以看得見。
第六行,Cre30,Exp 110,在30的時被創建,110時候被刪掉,但是在100時候,110還沒有發生,所以看得見。
綜上,就是這個事務對這六條記錄的可見性,也就是一個數據版本。那麼大家可以看一下如果另一個事務的快照里存的是最高事務編號為110,正在進行的事務為50,那麼它能看到的數據應該是哪幾行呢?同時大家也看到,Postgres里刪除一行數據其實就是在這一行的Exp這個列記錄一個刪除事務的編號,相當於做了一個刪除標記,而數據沒有真正被刪除,因此Postgres資料庫需要定期做數據清理操作(Vacuum)。Pstgres的在現實場景里會比這里介紹的要復雜,因為我們這里假定所有的事務最終都是正確提交了,如果存在某些事務沒有提交的情況,那麼可見性就會更加復雜,這里不再展開了。
資料庫事務是基本的資料庫概念,之前已經有很多很好文章做過介紹,這里希望能把自己的理解用比較通俗的描述分享給大家,歡迎來討論交流。
Ⅳ 資料庫事務具體是
資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。
原子性(Atomic)(Atomicity) 事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
一致性(Consistent)(Consistency) 事務在完成時,必須使所有的數據都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制所有已知的完整性約束。如,當開發用於轉賬的應用程序時,應避免在轉賬過程中任意移動小數點。隔離性(Insulation)(Isolation) 由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一並發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為隔離性,因為它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續運行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程序降低隔離級別以換取更大的吞吐量。持久性(Duration)(Durability) 事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
Ⅳ 「資料庫中的事務」是什麼
事務是作為一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱為 ACID(原子性、一致性、隔離性和持久性)屬性,x0dx0a 只有這樣才能成為一個事務:x0dx0a原子性x0dx0a事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。x0dx0ax0dx0a一致性x0dx0a事務在完成時,必須使所有的數據都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。x0dx0a 事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。x0dx0ax0dx0a隔離性x0dx0a由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一並發事務修改它之前的狀態,x0dx0a 要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為可串列性,因為它能夠重新裝載起始數據,x0dx0a 並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。x0dx0a持久性x0dx0a事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
Ⅵ 資料庫中的事務是什麼
只有這樣才能成為一個事務:原子性事務必須是原子工作單元;對於其數據修改,要麼全內都執行,要麼全容都不執行。
一致性事務在完成時,必須使所有的數據都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。
事務結束時,所有的內部數據結構(如
b
樹索引或雙向鏈表)都必須是正確的。
隔離性由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一並發事務修改它之前的狀態,
要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為可串列性,因為它能夠重新裝載起始數據,
並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
Ⅶ 什麼是資料庫中的事務
事務就是一系列的操作,這些操作完成一項任務.只要這些操作里有一個操作沒有版成功權,事務就操作失敗,發生
回滾
事件.即撤消前面的操作,這樣可以保證數據的一致性.而且可以把操作暫時放在緩存里,等所有操作都成功有提交資料庫,這樣保證費時的操作都是有效操作.
Ⅷ 資料庫中的事務是什麼
資料庫事務(簡稱:事務)是資料庫管理系統執行過程中的一個邏輯單位,由一個有限的資料庫操作序列構成。
一個資料庫事務通常包含了一個序列的對資料庫的讀/寫操作。它的存在包含有以下兩個目的:
為資料庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。
當多個應用程序在並發訪問資料庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
當事務被提交給了DBMS(資料庫管理系統),則DBMS(資料庫管理系統)需要確保該事務中的所有操作都成功完成且其結果被永久保存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行。
但在現實情況下,失敗的風險很高。在一個資料庫事務的執行過程中,有可能會遇上事務操作失敗、資料庫系統/操作系統失敗,甚至是存儲介質失敗等情況。這便需要DBMS對一個執行失敗的事務執行恢復操作,將其資料庫狀態恢復到一致狀態(數據的一致性得到保證的狀態)。為了實現將資料庫狀態恢復到一致狀態的功能,DBMS通常需要維護事務日誌以追蹤事務中所有影響資料庫數據的操作。
Ⅸ 什麼是資料庫事務
(1):事務(Transaction)是並發控制的單位,是用戶定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。通過事務,SQL
Server能將邏輯相關的一組操作綁定在一起,以便伺服器保持數據的完整性。
(2):事務通常是以BEGIN
TRANSACTION開始,以COMMIT或ROLLBACK結束。
COMMIT表示提交,即提交事務的所有操作。具體地說就是將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中去,事務正常結束。
ROLLBACK表示回滾,即在事務運行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對資料庫的所有以完成的操作全部撤消,滾回到事務開始的狀態。
(3):事務運行的三種模式:
A:自動提交事務
每條單獨的語句都是一個事務。每個語句後都隱含一個COMMIT。
B:顯式事務
以BEGIN
TRANSACTION顯式開始,以COMMIT或ROLLBACK顯式結束。
C:隱性事務
在前一個事務完成時,新事務隱式啟動,但每個事務仍以COMMIT或ROLLBACK顯式結束。
(4):事務的特性(ACID特性)
A:原子性(Atomicity)
事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。
B:一致性(Consistency)
事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
C:隔離性(Isolation)
一個事務的執行不能被其他事務干擾。
D:持續性/永久性(Durability)
一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。
注:事務是恢復和並發控制的基本單位。
Ⅹ 什麼是資料庫事務
資料庫事務,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地內執容行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。
一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
企業級的資料庫管理系統(DBMS)都有責任提供一種保證事務的物理完整性的機制。就常用的SQL Server2000系統而言,它具備鎖定設備隔離事務、記錄設備保證事務持久性等機制。因此,我們不必關心資料庫事務的物理完整性,而應該關注在什麼情況下使用資料庫事務、事務對性能的影響,如何使用事務等等。
事務有三種模型:
1、隱式事務是指每一條數據操作語句都自動地成為一個事務,事務的開始是隱式的,事務的結束有明確的標記。
2、顯式事務是指有顯式的開始和結束標記的事務,每個事務都有顯式的開始和結束標記。
3、自動事務是系統自動默認的,開始和結束不用標記。