還在學Hibernate,後續一大堆概念剛接觸需要理解。覺得-——事務——這個概念不是很好理解,所以發上來記錄一下。
首先說點千篇一律的東西。概念和特性都是隨處可見的,無論哪裡都很容易找到,關鍵是你如何去理解它。
概念:事務(Transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務通常由高級數據庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transaction和end transaction語句(或函數調用)來界定。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。
例如:在關系數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。
特性:事務是恢復和並發控制的基本單位。
事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
持久性(durability)。指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
————————————————————————————————————————————————————————————————————————
為什麼引入“事務”這個概念?
--->就像所有的文學,來自與生活,卻又高於生活一樣。事務的概念同樣的來自於生活,引入“事務”肯定是為了解決某種問題,不然,誰願意干這麼無聊的事情呢?
現實裡好比銀行轉賬一樣,當從一個帳戶轉出一部分錢之後,就必須在另一個帳戶中存入相同數目的錢,若是轉出錢之後,事務中止了,沒有在另一個帳戶中存錢,那麼錢就不翼而飛了(事務的原子性),這事肯定是擱在誰身上都是不干的事情。而在軟件中由於“事務”與數據庫相關,在這個數字化時代,一切即數字,當然包括錢了。這麼重要的東西一定得有所保障,既然“事務”能為它提供保障,那麼引入它也是理所當然的。
如何理解事務的原子性?
--->原子性在最初在物理上解釋為:不可再分割的。
可是在這裡卻感覺與物理上的理解有所不同,因為它把你隨便一個事務都劃分為原子性的,且它的原子性更偏向於結果的唯一性:要麼成功,要麼失敗。
我們可知在Hibernate中由session.beginTransaction();語句我們可以自定義一個事務,而用session.endtransaction()來告訴該事務的結束,那麼至於這兩者之間的操作當然可以由你自己定義了。這個事務可大可小但是結果只有一個。
事務是否可以什麼都不做?還是說一定要與數據庫聯系起來?
--->由事務的定義:“事務是訪問並可能更新數據庫中各種數據項的一個程序執行單元"可知,事務首先要實現對數據庫的訪問。這樣來看,事務是不可能什麼都不做的。因此事務的存在確實與數據庫相關。
事務的一致性?
--->這個問題不是很好理解。一致性與原子性關系密切。
假如有一個產品表和一個產品明細表,是父子關系,當我們添加產品表的時候,一定要添加產品明細表的資料,如果我們只是添加了產品表沒有添加產品明細,這樣就會是數據不一致,混亂,這裡我們就要用到事務了。
事務的隔離性?
--->這個比較好理解,若學過多線程的話就能理解多線程為什麼要引入鎖機制了。而同樣為了解決事務的並發問題而引入的事務的隔離級別,數據庫和應用程序都可以設置隔離級別。
事務的持久性?
--->假若你的事務是去銀行存錢,那麼你總不希望你剛剛提交完存錢請求之後(即事務已提交成功),由於突然的故障而讓你的金錢“失聯”吧!這就是事務的持久性。
這裡有個問題,如果我的“事務”過程只是存錢,那麼,根據以上的栗子,存錢完後——即事務已提交成功——那麼是不是意味著事務已經完成了呢?那麼後續的動作是不是就不是事務的范圍之內了呢?存錢的事務完成,動作就傳遞給了數據庫,那麼於數據庫的動作不再我剛剛那個“事務”當中呀!確實有待多了解。
事務與線程的同和異?