天天看點

bboss persistent事務管理介紹 (一)

bboss項目下載下傳清單 在sourceforge通路位址為: https://sourceforge.net/project/showfiles.php?group_id=238653

bboss persistent的事務管理架構實作資料庫的增、删、改、查事務管理,整個事務管理架構在下面的各節中詳細介紹。事務管理架構的實作原理模型見下圖:

應用程式中的事務TX都會和本地線程關聯,本地線程ThreadLocal是一個對上下文Thread關聯的線程獨占資源進行有效管理的容器。

4.9.1.多資料庫事務的支援(分布式事務)

一個事務中如果存在不同資料庫的操作,那麼事務的處理比較複雜,隻有所有的資料庫的操作都成功以後事務送出,否則事務復原。下面的代碼示範了如果管理兩個不同資料庫(分布式)事務:

Poolman.xml中配置了兩個資料源bspf和query:

  <datasource>

      ...

<dbname>bspf</dbname>

...

</datasource>

<datasource>

<dbname>query</dbname>

代碼段如下:   

           TransactionManager tm =  new TransactionManager();

       try

       {

           tm.begin();

           DBUtil db = new DBUtil();

             //在bspf庫上執行删除操作

           db.executeDelete("bspf","delete from table1 where id=1");

             //在query庫上執行更新操作

           db.executeUpdate("query","update table1 set value='test'

where id=1");

           tm.commit();

       }

       catch(Exception e)

           try {

              tm.rollback();

           } catch (RollbackException e1) {

              e1.printStackTrace();

           }

   }

上述代碼中對bspf庫上執行删除操作,在query庫上執行更新操作,兩個操作被包含在一個事務中,隻有兩個操作全部成功後事務才會成功,任何一個失敗,都會導緻事務被復原。

4.9.2.四種類型的事務

a.    必須建立新的事務(NEW_TRANSACTION)

b.    有事務就加入目前事務,沒有就不建立事務(MAYBE_TRANSACTION)

c.    有事務就加入目前事務,沒有就建立事務(REQUIRED_TRANSACTION)(預設情況)

d.    沒有事務(NO_TRANSACTION)

4.9.3.事務嵌套

對于同一個的事務中包含的事務定義為事務嵌套,事務所包含的子事務通過子事務計數器來管理,增加一個子事務時計數器加1,送出一個子事務時計數器減一,當計數器為零時送出所有事務,隻要事務執行過程中有rollback的情況則復原全部子事務。事務的嵌套具有一下16種組合,每種組合對全局事務的影響見表:

内部事務類型

外部事

務類型

NEW_TRANSACTION REQUIRED_TRANSACTION MAYBE_TRANSACTION NO_TRANSACTION
屏蔽聲明的事務,程式中開啟一個新事務 使用聲明的事務 屏蔽聲明的事務,程式在沒有事務的環境下運作
如果聲明的事務存在,屏蔽聲明的事務,程式中開啟一個新事務 如果聲明的事務存在,則使用聲明的事務,否則開啟一個新的事務 如果聲明的事務存在,則使用聲明的事務,否則不需聲明事務 如果聲明的事務存在,屏蔽聲明的事務,程式在沒有事務的環境下運作
程式中開啟一個新事務 程式在沒有事務的環境下運作

4.9.4.支援事務的挂起和恢複

事務的挂起包括挂起目前正在執行的事務和挂起所有的事務.

挂起目前正在執行的事務是指暫停目前線程中運作的事務。如果在執行目前事務之前有事務挂起則恢複之前挂起的事務,

挂起所有的事務是指将目前事務挂起同時不恢複之前事務,即在執行恢複之前的目前環境沒有事務關聯。

事務恢複:将之前挂起的事務進行恢複,事務繼續執行

4.9.5 事務管理的相關接口

事務管理器:com.frameworkset.orm.transaction.TransactionManager ,每個

接口表:

名稱 功能描述 說明
public void begin() throws TransactionException 開啟一個事務,如果目前上下文有事務則加入,如果沒有則建立新的事務 Begin方法隻能在TransactionManager的同一個對象執行個體上調用一次,超過一次将抛出事務異常

public

void

begin(int tx_type) throws TransactionException

開啟一個事務,參數tx_type值的取值範圍為:

NEW_TRANSACTION-<span style="color: navy; fo