事務管理之事務的基本概念總覽

       出於學習和工作的需要,從本章博文開始,我將把自己在學習中和工作中遇到的有關事務管理的問題,以及藉助網上一些牛人的博客內容,把開發過程中涉及到的事務的概念,問題,以及不同類型、不同平臺的事務管理做一個梳理和歸整。

      本系列博文初步計劃整理有關事務的一下幾個部分:

      1、事務的基本概念、屬性及事務的產生原因;

      2、java中事務的相關管理;

   2.1、jdbc事務管理

   2.2、JTA事務管理

      3、spring框架中對於事務的管理;

      4、hibernate框架對於事務的管理;

      5、分佈式環境下事務的管理。


一、什麼是事務?

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

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規範中,定義了4個事務隔離級別。

Read Uncommitted(未提交讀):

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

Read Committed(已提交讀):

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

Repeatable Read(可重複讀):

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

Serializable(串行化):

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

六、隔離級別對併發的控制 :

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

                 丟失更新髒讀非重複讀覆蓋更新幻像讀 

未提交讀(ISOLATION_READ_UNCOMMITTED)Y  YYY

已提交讀(READ_COMMITTED) N  NYY

可重複讀 (REPEATABLE_READ)N  NNN        Y 

串行化(SERIALIZABLE) NNNNN

七、事務涉及的對象:

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

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

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

八、事務的分類:

本地事務

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

分佈式事務

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

 

Java事務的類型有三種:

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

其他框架平臺的事務管理:

spring的事務管理

hibernate事務管理


文章觀點參考:事務基本概念

發佈了12 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章