日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

EJB事务控制(CMT和BMT两种方式以及JTA事务)

發(fā)布時(shí)間:2023/12/13 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 EJB事务控制(CMT和BMT两种方式以及JTA事务) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、EJB的事務(wù)管理分如下兩個(gè)方面:

1、CMT(容器管理事務(wù))

2、BMT(Bean管理事務(wù))

二、CMT介紹:

  容器管理事務(wù)主要是通過容器自動(dòng)控制事務(wù)的開啟,提交和回滾,開發(fā)人員不需要手工編寫代碼,由容器來控制事務(wù)的邊界,一般來說是業(yè)務(wù)方法的開始

是事務(wù)的開啟,業(yè)務(wù)方法的結(jié)束是事務(wù)的提交部分,當(dāng)程序遇到運(yùn)行時(shí)異常,事務(wù)會(huì)自動(dòng)回滾。如果遇到非運(yùn)行時(shí)異常想要回滾事務(wù)的話可以用SessionCon

Text的setRollBackOnly()方法來達(dá)到目的。下面的例子是一個(gè)使用CMT的例子:(事務(wù)的控制我們一般放在Service層,而不是Dao層)

示例程序1:(參考publicEJB組件的NewhouseManagerImpl類)

@Stateless(name = "newhouseManager") //狀態(tài)定義實(shí)列Bean 提供遠(yuǎn)程JNDI
@Remote(INewhouseManager.class)//定義遠(yuǎn)程接口
@Local(INewhouseManager.class)//定義本地接口
@TransactionManagement(TransactionManagementType.CONTAINER) // 這里來定義是CMT還是BMT

public class NewhouseManagerImpl implements INewhouseManager{

@EJB(beanName = "newhouseDAO") //注入dao
private IGenericDAO<Newhouse, Integer> newhouseDAO;

@TransactionAttribute(TransactionAttributeType.REQUIRED) //這里來定義事務(wù)的傳播特性,如果調(diào)用該組件的客戶方已經(jīng)開啟了事務(wù)則加入原事務(wù),否則開啟一個(gè)新事務(wù)
public Newhouse save(Newhouse entity) {
LogUtil.log("saving Newhouse instance", Level.INFO, null);
try {
LogUtil.log("save successful", Level.INFO, null);
entity.setBname("測(cè)試1:" + new Date());
newhouseDAO.create(entity); //插入第一條記錄,此時(shí)事務(wù)還沒有提交,數(shù)據(jù)庫里面看不到該記錄

Newhouse entity2 = new Newhouse();
entity2.setBname("測(cè)試2");
entity2.setPath(null); // 這里設(shè)置path為null的話,會(huì)出現(xiàn)運(yùn)行時(shí)異常,事務(wù)會(huì)回滾,entity1和entity2將不會(huì)插入到public庫的newhouse表中
newhouseDAO.create(entity2);

} catch (RuntimeException re) {
LogUtil.log("save failed", Level.SEVERE, re);
re.printStackTrace();

return null;
}

PS:這里要特別注意NewhouseDAO這個(gè)類,需要添加@TransactionAttribute(TransactionAttributeType.REQUIRED)這個(gè)注解,我們項(xiàng)目里面原來的事務(wù)傳播屬性

設(shè)置的是REQUIRES_NEW,這樣會(huì)將原來的事務(wù)掛起,然后開啟一個(gè)新的事務(wù)。

三、BMT介紹

  BMT主要是通過手工編程來實(shí)現(xiàn)事務(wù)的開啟、提交和回滾,相對(duì)于CMT來說雖然增加了工作量,但是控制力度更細(xì),而且更加靈活,我們可以再出現(xiàn)異常的時(shí)候回滾事務(wù)

,也可以通過JMS返回或者遠(yuǎn)程調(diào)用返回值來控制事務(wù)的回滾或提交;使用BMT需要用到UserTransaction這個(gè)類的實(shí)例來實(shí)現(xiàn)事務(wù)的begin、commit和rollback,可以通過

Ejb注解的方式獲得這個(gè)類實(shí)例,也可以用EJBContext.getUserTransaction來獲得。下面是一個(gè)使用BMT的例子:

示例程序2:

@Stateless(name = "newhouseManager") //狀態(tài)定義實(shí)列Bean 提供遠(yuǎn)程JNDI
@Remote(INewhouseManager.class)//定義遠(yuǎn)程接口
@Local(INewhouseManager.class)//定義本地接口
@TransactionManagement(TransactionManagementType.BEAN) //設(shè)置為BMT事務(wù)

public class NewhouseManagerImpl implements INewhouseManager{

@Resource
private UserTransaction ut; //注入U(xiǎn)serTransaction

@EJB(beanName = "newhouseDAO") //注入dao
private IGenericDAO<Newhouse, Integer> newhouseDAO;

@TransactionAttribute(TransactionAttributeType.REQUIRED) //設(shè)置事務(wù)的傳播特性為required
public Newhouse save(Newhouse entity) {
LogUtil.log("saving Newhouse instance", Level.INFO, null);
try {
ut.begin();
LogUtil.log("save successful", Level.INFO, null);
entity.setBname("測(cè)試1:" + new Date());
newhouseDAO.create(entity);
Newhouse entity2 = new Newhouse();
entity2.setBname("測(cè)試2");
entity2.setPath(null);
newhouseDAO.create(entity2);
ut.commit();
} catch(RuntimeException e) {

      ut.rollBack();

}.........................

..........................

........................

}

測(cè)試效果和示例程序1一樣

四、跨多個(gè)數(shù)據(jù)庫的事務(wù)控制(JTA事務(wù))

如果想要在一個(gè)事務(wù)操作中控制多個(gè)數(shù)據(jù)庫的操作,需要如下兩步操作:

1、需要設(shè)置persistence.xml里面的datasouce支持jta事務(wù),另外設(shè)置transaction-type為jta,如下所示

<persistence-unit name="public_master" transaction-type="JTA">
<jta-data-source>java:/public_master_db</jta-data-source>
<properties>
<property name="hibernate.dialect" value="com.jiwu.core.utils.BlobMySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>

<persistence-unit name="build_master" transaction-type="JTA">
<jta-data-source>java:/build_master_db</jta-data-source>
<property name="hibernate.dialect" value="com.jiwu.core.utils.BlobMySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>

2、修改jboss安裝目錄下的serverdefaultconfjbossjta-properties.xml

在<properties depends="arjuna" name="jta">這個(gè)節(jié)點(diǎn)下,添加一個(gè)子節(jié)點(diǎn)<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true"/>

實(shí)例程序3:

@Stateless(name = "newhouseManager") //狀態(tài)定義實(shí)列Bean 提供遠(yuǎn)程JNDI
@Remote(INewhouseManager.class)//定義遠(yuǎn)程接口
@Local(INewhouseManager.class)//定義本地接口
@TransactionManagement(TransactionManagementType.BEAN) //設(shè)置為BMT事務(wù)

public class NewhouseManagerImpl implements INewhouseManager{

@Resource
private UserTransaction ut; //注入U(xiǎn)serTransaction

@EJB(beanName = "newhouseDAO") //注入dao
private IGenericDAO<Newhouse, Integer> newhouseDAO;


@EJB(beanName = "buildDAO") //注入houseDAO測(cè)試
private IGenericDAO<Build, Integer> buildDAO;


@TransactionAttribute(TransactionAttributeType.REQUIRED) //設(shè)置事務(wù)的傳播特性為required
public Newhouse save(Newhouse entity) {
LogUtil.log("saving Newhouse instance", Level.INFO, null);
try {
ut.begin();
LogUtil.log("save successful", Level.INFO, null);
entity.setBname("測(cè)試1:" + new Date());
newhouseDAO.create(entity);
Newhouse entity2 = new Newhouse();
entity2.setBname("測(cè)試2");
entity2.setPath(null); //這里不設(shè)置為null的話,不出現(xiàn)異常,entity1和entity2會(huì)插入到public庫的newhouse表中,另外build庫的build表中id為2的被刪除
newhouseDAO.create(entity2);

    buildDAO.delete(2);


ut.commit();
} catch(RuntimeException e) {

      ut.rollBack(); //出現(xiàn)異常,entity1和entity2不會(huì)插入到public庫的newhouse表中,另外build庫的build表中id為2的記錄也不會(huì)刪除

}.........................

..........................

........................

}

總結(jié)

以上是生活随笔為你收集整理的EJB事务控制(CMT和BMT两种方式以及JTA事务)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。