国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

EJB 自管理的事務(wù)

2019-11-18 11:03:06
字體:
供稿:網(wǎng)友

 

假如聲明一個bean的事務(wù)控制為TX_BEAN_MANAGED,則這個bean可以訪問事務(wù)服務(wù)。當(dāng)事務(wù)控制應(yīng)用于單個的方法時這個控制只能應(yīng)用于整個的bean. bean訪問事務(wù)服務(wù)的能力不能只對某個方法起作用。因此一個方法聲明事務(wù)控制為TX_BEAN_MANAGED,而另一個方法聲明為其它不同的事務(wù)控制是錯誤的。廠商的安裝工具應(yīng)該能檢測到并報告這個錯誤。Bean分別通過初始化時setsessionContext()或setEntityContext()方法的參數(shù) SessionContext或EntityContext來訪問事務(wù)服務(wù)。這些接口都是EJBContext的子類。

  EJBContext的定義如下:

  Public interface javax.ejb.EJBContext {
    public Identity getCallerIdentity();
    public boolean isCallerInRole(Identity other);
    public EJBHome getEJBHome();
    public PRoperties getEnvironment();
    public UserTransaction getUserTransaction() throwsIllegalStateException;
    public boolean getRollbackOnly();
    public void set RollbackOnly();
  }

  一旦bean獲得了一個UserTransaction的引用,就可以用這個引用治理自己的事務(wù)。有狀態(tài)的會話bean的方法可以創(chuàng)建一個事務(wù),而且不用終止事務(wù)就可以返回。假如還有線程調(diào)用bean的方法,容器檢測是否有bean創(chuàng)建的活動的事務(wù),假如被調(diào)用的事務(wù)是同一個事務(wù),容器會答應(yīng)該線程重新進入這個bean.假如bean在事務(wù)中且執(zhí)行不同事務(wù)上下文的線程試圖進入bean,容器會阻塞這個線程直到bean的事務(wù)終止。假如線程試圖進入事務(wù)時bean不在事務(wù)中,線程會執(zhí)行一個自己的事務(wù),容器會掛起線程當(dāng)前的事務(wù)以答應(yīng)線程進入。一旦線程離開方法就會恢復(fù)線程以前的事務(wù),容器不會終止任何方法創(chuàng)建的事務(wù)。

   對于無狀態(tài)會話bean和實體bean,當(dāng)事務(wù)活動時bean的方法不答應(yīng)返回。容器會為此拋出一個例外。

  Leaving a tranaction active across method calls is stateful,and is not allowed for stateless session beans.Fro similar reasons,entity beans are also not allowed to maintain an open transaction state across method calls when the bean has declared the TX_BEAN_MANAGED transaction control.

  會話同步接口
  有狀態(tài)和無狀態(tài)的會話bean都可以訪問數(shù)據(jù)庫,并且參與一個事務(wù)。為了讓bean在事務(wù)中執(zhí)行它的任務(wù),bean開發(fā)者可以實現(xiàn)在bean中實現(xiàn) javax.ejb.SessionSynchronization接口。容器能自動檢測這個接口,容器會使用這個接口中的方法以使bean得到事務(wù)的狀態(tài)信息。實體bean不支持這個接口。因為實體bean are implicitly transaction aware,所以容器使用不同的方法控制一個事務(wù)中的實體 bean.

  SessionSynchronization接口定義如下:

  public interface javax.ejb.SessionSynchronization {
    public void afterBegin() throws RemoteException;
    public void beforeCompletion() throws RemoteException;
    public void afterCompletion(boolean yn) throws RemoteException;
  }

  實際上一個事務(wù)不屬于一個非凡的bean的實例。一個客戶端或容器中執(zhí)行的線程創(chuàng)建一個事務(wù),在執(zhí)行bean中的代碼時執(zhí)行該事務(wù)。假如一個有事務(wù)上下文的線程將要進入一個會話bean,容器首先調(diào)用它的afterBegin()方法。Bean可以記錄所有的商業(yè)方法運行在事務(wù)中,隨后執(zhí)行事務(wù)操作。假如一個操作的內(nèi)部標志顯示這個線程在事務(wù)外運行,則會拒絕執(zhí)行事務(wù)操作的請求。直到調(diào)用afterCompletion()方法,bean會繼續(xù)認為商業(yè)方法的調(diào)用都在事務(wù)中執(zhí)行。Bean將推斷性地清除內(nèi)部標志,以表示隨后到來的事務(wù)請求將被拒絕。

  假如一個事務(wù)上下文的線程試圖進入一個已經(jīng)是另一個事務(wù)的一部分的Bean時, .Container將封鎖入口,直到前一個事務(wù)提交或回滾,并且afterCompletion()方法被調(diào)用,此時,答應(yīng)Bean 恢復(fù)它的狀態(tài)。Container負責(zé)提供這些行為。當(dāng)Container發(fā)現(xiàn)它將要提交一個事務(wù)時,將在這個事務(wù)的所有的session Bean上調(diào)用beforeCompletion()方法。這就給Bean足夠的機會來結(jié)束事務(wù)的操作,如在提交前將數(shù)據(jù)寫入數(shù)據(jù)庫。反之,當(dāng)Container 發(fā)現(xiàn),將要回滾一個事務(wù)撕,BeforeCompletion()方法將不會被調(diào)用,因為將一個將被回滾的事務(wù)所產(chǎn)生的數(shù)據(jù)寫入數(shù)據(jù)庫是沒有意義 的。

  AfterCompletion()是在一個事務(wù)即將提交或回滾時被調(diào)用,來通知Bean事務(wù)操作的最終結(jié)果。Bean可以用這個信息來修正自己的內(nèi)部狀態(tài),但它不能用這個信息來維持任何它將要保存的事務(wù)。盡管session Bean可以創(chuàng)建,提交和回滾它自己的事務(wù),但通常不推薦這樣做。

  SessionSynchronization接口不提供整合外部和內(nèi)部事務(wù)的能力。假如一個session bean實現(xiàn)了這個接口,則意味著它在方法調(diào)用之間要保持事務(wù)的狀態(tài)。非凡地,這也暗示在afterBegin()和afterCompletion()調(diào)用之間bean是處于一個事務(wù)中。這樣,假如一個bean實現(xiàn)了SessionSynchronization接口并且在裝配符中聲明是無狀態(tài)的就是一個錯誤。廠商提供的安裝工具應(yīng)該可以捕捉到并報告這個錯誤。無狀態(tài)的session bean可以加入一個事務(wù),但它們不能實現(xiàn)這個接口。事務(wù)可以是TX_BEAN_MANAGED,或者container可以在方法入口和從方法的返回上來開始和提交這個事務(wù)。Container不可答應(yīng)在一個現(xiàn)存的事務(wù)中有一個線程進入方法,因為無狀態(tài)的Bean的方法將無法知道正在運行的線程是否正在一個事務(wù)中。

  解決這個問題的一個方法是使container掛起現(xiàn)存的事務(wù),強迫方法總是認為線程沒有在一個事務(wù)性的上下文中運行。有狀態(tài)的Bran可以不實現(xiàn)這個接口而介入事務(wù)。但是,裝配符必須要認真地配置以使得商務(wù)方法總能在正確的事務(wù)狀態(tài)中運行。Bean自己沒有通過這個接口來獲得自己的事務(wù)的狀態(tài)的權(quán)利。

  加入事務(wù)
  EJBContext接口在前面的一節(jié)中已經(jīng)介紹了。其中有兩個方法:

  public boolean getRollbackOnly();
  public void setRoolbackOnly();

  這些方法可以有任何bean來使用,而不僅僅是那些聲明了其事務(wù)控制為bean-managed的bean。事實上,那些處理自己的事務(wù)的bean將不會用到這些方法,因為這些方法不是用來和外界的事務(wù)治理器進行交流事務(wù)狀態(tài)的。

  當(dāng)一個bean調(diào)用了setRollBackOnly()方法時,它是在向事務(wù)治理器詢問何時結(jié)束將要回滾的當(dāng)前事務(wù)。它將給它所參與的事務(wù)的結(jié)果一個選票。這些方法還存在于UserTransaction接口中,但由于大多數(shù)的bean都不訪問這個接口,這些方法必須直接地在EJBContext中提供給bean。注重這個方法并不引發(fā)回滾操作,它只是簡單地設(shè)置標志,表示事務(wù)在結(jié)束時應(yīng)該回滾。不象JavaBan屬性設(shè)置方法,這個方法不以boolean值作為參數(shù)。這個方法是特意設(shè)計成這樣,以使得一個bean不能夠改變另一個bean的回滾請求。一個bean也許希望使用getRoolBackOnly()方法,來檢查當(dāng)前的事務(wù)的狀態(tài)。假如另一個bean已經(jīng)標志這個事務(wù)為rollback,則正在調(diào)用的bean可以推測到并決定不能執(zhí)行那些在、強制性達到操作,如數(shù)據(jù)庫更新,而這些操作很有可能在事務(wù)結(jié)束時被反轉(zhuǎn)過來。

  客戶劃分的事務(wù)
  盡管一個JEB廠商所必須的,大服務(wù)器廠商也許決定提供一個類,使得用戶可以直接訪問事務(wù)治理器。當(dāng)需要在同一個上下文中在兩個不同的服務(wù)器上調(diào)用bean時,用戶也許會希望這樣做。當(dāng)然,每個bean的裝配符可以答應(yīng)這樣的行為。用戶可以創(chuàng)建一個事務(wù),然后在兩個不同server上的兩個不同的bean上調(diào)用商務(wù)方法,而將事務(wù)的上下文也作為調(diào)用的一部分進行傳遞。一旦調(diào)用結(jié)束,用戶將推測地結(jié)束事務(wù)。有container廠商產(chǎn)生的stub和skeleton將支持事務(wù)上下文的隱式傳遞。

  這里是一個可能的例子:

  Current current = new Current();
  Current.setServiceProvider(txMgrURL);
  Current.create();
  Current.begin();
  Current.doSomeWork();
  RemRef1.doSomeWork();
  RemRef2.doMoreWork();
  Current.commit();

  數(shù)據(jù)庫操作的事務(wù)治理
  bean當(dāng)然希望使用JDBC來建立到數(shù)據(jù)庫的連接,并在其上進行操作。但是,為了符合EJB這種container治理事務(wù)的模式,連接不能使用自動提交特性,并且不應(yīng)該在連接上試圖提交或回滾。

  Container的角色是決定在這個事務(wù)中執(zhí)行的所有行為應(yīng)該提交還是回滾。這里提這樣一個問題很好:container如何看到并治理由bean方法內(nèi)部創(chuàng)建的數(shù)據(jù)庫連接。盡管在規(guī)范中沒有明確地提到,EJB將只能使用JDBC驅(qū)動,而JDBC也正是用來和EJB配合使用的。在數(shù)據(jù)庫連接的創(chuàng)建時,驅(qū)動程序透明地將連接注冊到正在執(zhí)行的線程的當(dāng)前事務(wù)中。之后當(dāng)container決定結(jié)束事務(wù)時,數(shù)據(jù)庫連接將自動地結(jié)束它。用OTS的術(shù)語說,數(shù)據(jù)庫連接是不可恢復(fù)的資源,有事務(wù)服務(wù)在container的協(xié)助下,隱式地治理。盡管可以在這種情況下使用非事務(wù)感知的JDBC Driver,但開發(fā)者必須清楚任何在數(shù)據(jù)庫連接上所做的操作都不屬于bean的事務(wù),開發(fā)者還必須確保在從方法返回之前結(jié)束數(shù)據(jù)庫連接事務(wù)。試圖使用SessionSynchronization接口來合并數(shù)據(jù)庫連接事務(wù)和bean本身的事務(wù)是不可靠的,是不應(yīng)該作的。

  分布事務(wù)的支持
  一個分布事務(wù)在下面的情況下是需要的:
  . 一個用戶使用用戶劃分的在多個server上的多個bean中創(chuàng)建和調(diào)用方法的事務(wù)。
  . 一個在其他的server上調(diào)用其他EJB的方法的bean的方法。

  對于這些工作廠商必須為EJBObject生成stub和skeleton來隱式地獲得當(dāng)前事務(wù)的上下文,同時將其通過方法調(diào)用傳到遠程bean。當(dāng)將商務(wù)方法調(diào)用委派給bean時,遠程bean的EJBObject的skeleton必須請求這個事務(wù)的上下文。



上一篇:Java虛擬機

下一篇:淺析J2EE、J2SE和J2ME

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东山县| 灵石县| 阿拉善右旗| 黄山市| 寿阳县| 革吉县| 浮山县| 军事| 阿尔山市| 博野县| 修水县| 阳江市| 台安县| 红河县| 吐鲁番市| 开封县| 织金县| 平阳县| 濮阳市| 平昌县| 绥阳县| 昌都县| 宜章县| 安化县| 宁河县| 清远市| 友谊县| 马公市| 新乡市| 石棉县| 罗城| 英德市| 四会市| 二手房| 金平| 射阳县| 金山区| 黑山县| 丹巴县| 孙吴县| 班戈县|