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 |