JAVA事務系列一:事務基本概念


什么是事務?

事務的概念最開始出現在關系型數據庫中,英文解釋如下:

A database transaction is a larger unit that frames multiple SQL statements. A transaction ensures that the action of the framed statements is atomic with respect to recovery.

事務是確保"同時成功則成功,任何一個失敗則失敗"的一種機制。一個事務往往包括三種動作行為:開始事務(Begin Transaction),提交事務(Commit)和回滾(Rollback)。從開始事務到提交事務過程中所發生的一切數據庫修改要么同時成功(被Commit,固化在數據庫中),要么一個失敗,大家同時回復原有狀態(Rollback,數據庫回復到事務開始時的狀態)。

簡單的理解:它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。

隨着IT技術的發展,事務的范疇也變大,又稱之為交易,指一個程序或程序段,在一個或多個資源如 數據庫 或文件上為完成某些功能的執行過程的集合。

事務基本屬性:

事務的ACID特點分別是指原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。

原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要么都做,要么都不做。
一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
持久性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

數據庫事務有以下3種運行模式:

自動提交事務:每條單獨的語句都是一個事務。
顯式事務:每個事務均以BEGIN TRANSACTION語句顯式開始,以COMMIT或ROLLBACK語句顯式結束。
隱性事務:在上個事務完成時新事務隱式啟動,但每個事務仍以COMMIT或ROLLBACK語句顯式完成。

事務的並發控制 :

如果不對事務進行並發控制,並發事務的無序執行將會破壞數據的完整性。事務並發執行可能導致的異常可以分為以下幾種情況。

Lost update(丟失更新)

    A和B事務並發執行,A事務執行更新后,提交;B事務在A事務更新后,B事務結束前也做了對該行數據的更新操作,然后回滾,則兩次更新操作都丟失了。

更新都做白搞了,被一個不爭氣的事務又還原了!


Dirty Reads(臟讀)

    A和B事務並發執行,B事務執行更新后,A事務查詢B事務沒有提交的數據,B事務回滾,則A事務得到的數據不是數據庫中的真實數據。也就是臟數據,即和數據庫中不一致的數據。

讀了數據庫中不存在的數據,感覺被人忽悠了。


Non-repeatable Reads(非重復讀)

    A和B事務並發執行,A事務查詢數據,然后B事務更新該數據,A再次查詢該數據時,發現該數據變化了。

在同一事務中兩次讀取中被其他事務強行修改,有種橫刀奪愛,物是人非的意思。


Second lost updates(第二類丟失更新,可以稱為覆蓋更新):

    是非重復讀的一種特殊情況,即A事務更新數據,然后B事務更新該數據,A事務查詢發現自己更新的數據變了。

一個事務修改了數據,事后發現不是按照自己意思修改的,原來是被另外一個事務做了手腳,偷天換日!


Phantom Reads(幻像讀)

    A和B事務並發執行,A事務查詢數據,B事務插入或者刪除數據,A事務再次查詢發現結果集中有以前沒有的數據或者以前有的數據消失了。

這么多問題,可以分類理解:事務A查詢或修改數據,與此同時事務B也修改數據,根據事務B的完成情況(事務成功完成,事務回滾)可以區分不同問題。

數據庫的sql-92隔離級別:

一個事務與其他事務隔離的程度稱為隔離級別。數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,數據一致性就越好,但並發性越弱。為了兼顧並發效率和異常控制,在標准SQL規范中,定義了4個事務隔離級別。

Read Uncommitted(未提交讀):

    即使一個更新語句沒有提交,別的事務也可以讀到這個改變。如果一個事務已經開始寫數據,則另外一個事務不允許同時進行寫操作,但允許其他事務讀此行數據。

Read Committed(已提交讀):

    更新語句提交以后別的事務才能讀到這個改變。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。

Repeatable Read(可重復讀):

    在同一個事務里面先后執行同一個查詢語句的時候,確保得到的結果是一樣的。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

Serializable(串行化):

    事務執行的時候不允許別的事務並發執行。事務串行化執行,事務只能一個接着一個地執行,而不能並發執行。

隔離級別對並發的控制 :

各隔離級別對各種異常的控制能力如下表所示,其中Y表示會出現該種異常,N表示不會出現該種異常。

丟失更新 臟讀 非重復讀 覆蓋更新 幻像讀 

未提交讀 Y Y Y Y Y 

已提交讀 N N Y Y Y 

可重復讀 N N N N Y 

串行化 N N N N N

事務涉及的對象:

資源:應用程序存儲和獲取數據的地方,可以是數據庫,文件,也可以是內存。如果是應用程序的事務塊代碼中涉及到的數據庫,文件,內存,那這些資源就稱為事務型資源

資源管理器:在事務模型中,應用不是直接訪問資源,而是通過中間介訪問資源,這個中間介就叫資源管理器。資源分為可持久化資源(對應了持久化資源管理),易失資源(對應了易失資源管理器)。

事務管理器:實現事務的開始,提交,回滾。

事務的分類:

本地事務

本地(Local Transaction)事務指只有一個數據源參與的事務,比如只有數據庫或者只有JMS;

分布式事務

分布式事務(Distributed Transaction)指有多個數據源同時參與的事務,比如一項操作需要同時訪問數據庫和通過JMS發送消息,或者一項操作需要同時訪問兩個不同數據庫。對於分布式事務,Java提供了JTA規范,它的原理與本地事務存在不同。

 

Java事務的類型有三種:

JDBC事務、JTA(Java Transaction API)事務、容器事務。


免責聲明!

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



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