大體含義就是,事務的產生,其實是為了當應用程式訪問資料庫的時候,事務能夠簡化我們的程式設計模型,不需要我們去考慮各種各樣的潛在錯誤和併發問題.可以想一下當我們使用事務時,要麼提交,要麼回滾,我們不會去考慮網路異常了,伺服器宕機了,同時更改乙個資料怎麼辦對吧.
因此事務本質上是為了應用層服務的.而不是伴隨著資料庫系統天生就有的.
acid裡的aid都是資料庫的特徵,也就是依賴資料庫的具體實現.而唯獨這個c,實際上它依賴於應用層,也就是依賴於開發者.這裡的一致性是指系統從乙個正確的狀態,遷移到另乙個正確的狀態.什麼叫正確的狀態呢?就是當前的狀態滿足預定的約束就叫做正確的狀態.而事務具備acid裡c的特性是說通過事務的aid來保證我們的一致性.
做個比喻事務就好比乙個保鏢,我們提到事務就會說acid,而我們提到保鏢會說強壯,保護安全,好功夫,踏實.這裡強壯,好功夫和踏實都是保鏢自己的特徵,而安全是屬於你的,而你通過保鏢的特徵來保護你的安全.但是這裡必須注意,我們能夠通過aid保證我們的一致性,但事務本身沒辦法確保.用上面保鏢的例子來說,你正常被保護一定是安全的,但是你故意騙保鏢離開你身邊,然後你自己溜出去玩.同樣,如果你在事務裡故意寫出違反約束的**,比如銀行系統定時每天給自己的賬戶打入100w,這個事務是沒辦法的.
舉個大家都在說的財務系統的例子.
a要向b支付100元,而a的賬戶中只有90元,並且我們給定賬戶餘額這一列的約束是,不能小於0.那麼很明顯這條事務執行會失敗,因為90-100=-10,小於我們給定的約束了.這個例子裡,支付之前我們資料庫裡的資料都是符合約束的,但是如果事務執行成功了,我們的資料庫資料就破壞約束了,因此事務不能成功,這裡我們說事務提供了一致性的保證.然後我們再看個例子
a要向b支付100元,而a的賬戶中只有90元,我們的賬戶餘額列沒有任何約束.但是我們業務上不允許賬戶餘額小於0.因此支付完成後我們會檢查a的賬戶餘額,發現餘額小於0了,於是我們進行了事務的回滾.這個例子裡,如果事務執行成功,雖然沒有破壞資料庫的約束,但是破壞了我們應用層的約束.而事務的回滾保證了我們的約束,因此也可以說事務提供了一致性保證(ps:事實上,是我們應用層利用事務回滾保證了我們的約束不被破壞).最後我們再看個例子
a要向b支付100元,而a的賬戶中只有90元,我們的賬戶餘額列沒有任何約束.然後支付成功了.這裡,如果按照很多人的理解,事務不是保證一致性麼?直觀上賬戶餘額為什麼能為負呢.但這裡事務執行前和執行後,我們的系統沒有任何的約束被破壞.一直都是保持正確的狀態.
所以,綜上.你可以理解一致性就是:應用系統從乙個正確的狀態到另乙個正確的狀態.而acid就是說事務能夠通過aid來保證這個c的過程.c是目的,aid都是手段.
oracle事務一致性 原子性
事務的動作要麼一起成功,要麼都不成功,這是事務的原子性。原子性包括 語句級原子性 過程級原子性 事務級原子性 ddl與原子性 如果某條語句 如insert update 執行成功與否會自動控制事務。如設定插入前的觸發器。create table t2 cnt int insert into t2 v...
理解事務 原子性 一致性 隔離性
事務是指對系統進行的一組操作,為了保證系統的完整性,事務需要具有acid特性,具體如下 1.原子性 atomic 乙個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。回滾實際上是乙個比較高層抽象的概念,大多數db在...
事務一致性與原子性的區別
其實一致性和原子性在事務裡是兩個不太相關,但又很相關的邏輯來的 一致性 這個講的是事務是按照預期生效的,也就是你舉例的那個轉賬的,一致性的核心一部分是靠原子性實現的,而另一部分是邏輯實現。舉個例子吧 轉賬 張三給李四轉賬100元。那資料庫假設需要 張三扣100,李四加100,記錄一條流水。如果流水沒...