1、事務的概念html
事務是保證數據庫從一個一致性的狀態永久地變成另一個一致性狀態的根本,其中,ACID是事務的基本特性。java
A是Atomicity,原子性。一個事務每每涉及到許多的子操做,原子性則保證這些子操做要麼都作,要麼都不作,而不至於出現事務的部分操做成功,而另一部分操做沒有成功。若是事務在執行的過程當中發生錯誤,那麼數據庫將回滾到事務發生以前的狀態。好比銀行的轉帳服務,這個事務的最終結果必定是:某個帳戶的餘額增長了x,而另一個帳戶的餘額減小了x,或者兩個帳戶的餘額未發生變化。而不會出現其餘狀況。算法
C是Consistency,一致性。一致性是指事務發生前和發生之後,都不會破壞數據庫的約束關係,保證了數據庫元素的正確性、有效性和完整性。這種約束關係能夠是數據庫內部的約束,好比數據庫元素的值必須在必定的範圍內,也能夠是應用帶來的約束,好比轉帳之後銀行帳戶的餘額不能爲負數。sql
I是Isolation,隔離性。一個事務的操做在未提交之前,是不會被並行發生的其餘事務訪問到的。也就是說,數據庫操做不會看到某個事務的中間操做結果,好比轉帳過程當中,用戶是不能查詢到一個帳戶餘額減小了,而另一個帳戶餘額未發生變化的狀況。數據庫
D是Durability,持久性。事務完成之後,它對數據庫的影響是永久性的,即便在數據庫系統發生宕機或者其餘故障的狀況下,這種影響也會獲得保持。網絡
來自 <http://www.blogjava.net/freeman1984/archive/2011/10/09/360269.html>nosql
2 兩階段提交分佈式
在分佈式系統中,事務每每包含有多個參與者的活動,單個參與者上的活動是可以保證原子性的,而多個參與者之間原子性的保證則須要經過兩階段提交來實現,兩階段提交是分佈式事務實現的關鍵。spa
很明顯,兩階段提交保證了分佈式事務的原子性,這些子事務要麼都作,要麼都不作。而數據庫的一致性是由數據庫的完整性約束實現的,持久性則是經過commit日誌來實現的,不是由兩階段提交來保證的。至於兩階段提交如何保證隔離性,能夠參考Large-scale Incremental Processing Using Distributed Transactions and Notifications中兩階段提交的具體實現。.net
兩階段提交的過程涉及到協調者和參與者。協調者能夠看作成事務的發起者,同時也是事務的一個參與者。對於一個分佈式事務來講,一個事務是涉及到多個參與者的。具體的兩階段提交的過程以下:
第一階段:
首先,協調者在自身節點的日誌中寫入一條的日誌記錄,而後全部參與者發送消息prepare T,詢問這些參與者(包括自身),是否可以提交這個事務;
參與者在接受到這個prepare T 消息之後,會根據自身的狀況,進行事務的預處理,若是參與者可以提交該事務,則會將日誌寫入磁盤,並返回給協調者一個ready T信息,同時自身進入預提交狀態狀態;若是不能提交該事務,則記錄日誌,並返回一個not commit T信息給協調者,同時撤銷在自身上所作的數據庫改;
參與者可以推遲發送響應的時間,但最終仍是須要發送的。
第二階段:
協調者會收集全部參與者的意見,若是收到參與者發來的not commit T信息,則標識着該事務不能提交,協調者會將Abort T 記錄到日誌中,並向全部參與者發送一個Abort T 信息,讓全部參與者撤銷在自身上全部的預操做;
若是協調者收到全部參與者發來prepare T信息,那麼協調者會將Commit T日誌寫入磁盤,並向全部參與者發送一個Commit T信息,提交該事務。若協調者遲遲未收到某個參與者發來的信息,則認爲該參與者發送了一個VOTE_ABORT信息,從而取消該事務的執行。
參與者接收到協調者發來的Abort T信息之後,參與者會終止提交,並將Abort T 記錄到日誌中;若是參與者收到的是Commit T信息,則會將事務進行提交,並寫入記錄
通常狀況下,兩階段提交機制都能較好的運行,當在事務進行過程當中,有參與者宕機時,他重啓之後,能夠經過詢問其餘參與者或者協調者,從而知道這個事務到底提交了沒有。固然,這一切的前提都是各個參與者在進行每一步操做時,都會事先寫入日誌。
惟一一個兩階段提交不能解決的困境是:當協調者在發出commit T消息後宕機了,而惟一收到這條命令的一個參與者也宕機了,這個時候這個事務就處於一個未知的狀態,沒有人知道這個事務究竟是提交了仍是未提交,從而須要數據庫管理員的介入,防止數據庫進入一個不一致的狀態。固然,若是有一個前提是:全部節點或者網絡的異常最終都會恢復,那麼這個問題就不存在了,協調者和參與者最終會重啓,其餘節點也最終也會收到commit T的信息。
3 日誌
數據庫日誌保證了事務執行的原子性和持久性,日誌類型能夠分爲redo log,undo log,undo/redo log。關於這幾種日誌形式的具體介紹,能夠參照:
http://nosql-wiki.org/foswiki/bin/view/Main/TransactonLog
轉載自:http://rdc.taobao.com/blog/cs/?p=1183
來自 <http://www.blogjava.net/freeman1984/archive/2011/10/09/360269.html>
ORACLE 自治事務
結束一個自治事務必須提交一個commit、rollback或執行ddl,不然會產生Oracle錯誤ORA-06519: active autonomous transaction detected and rolled back 。保存點沒法在自治事務中回滾到父事務中的一個保存點,只能在內部使用保存點。
來自 <http://www.cnblogs.com/Ronger/archive/2012/02/15/2352527.html>
AUTONOMOUS TRANSACTION(自治事務,如下AT)
主事務(如下MT)調用可是獨立於它的事務。
運用AT時,有一些注意事項,簡單列舉以下:
1. 在匿名PL/SQL塊中,只有頂級的匿名PL/SQL塊能夠被設爲AT
2. 若是AT試圖訪問被MT控制的資源,可能有deadlock發生.
3. Package 不能被聲明爲AT,只有package所擁有的function和procedure 才能聲明爲AT
4. AT程序必須以commit 或rollback結尾,不然會產生Oracle錯誤ORA-06519: active autonomous transaction detected and rolled back
在程序開發時,若是充分運用AUTONOMOUS TRANSACTION的特性,必定能取得事倍功半的效果.
分佈式事務是指發生在多臺數據庫之間的事務,Oracle中經過dblink方式進行事務處理,分佈式事務比單機事務要複雜的多。大部分的關係型數據庫經過兩階段提交(2 Phase Commit 2PC)算法來完成分佈式事務,