??xml version="1.0" encoding="utf-8" standalone="yes"?>麻豆免费在线,国产精品永久免费,√…a在线天堂一区http://www.aygfsteel.com/human2008/category/28782.htmlzh-cnFri, 11 Jan 2008 14:49:20 GMTFri, 11 Jan 2008 14:49:20 GMT60JavaEE事务扫盲W记之一扫扫到尾 http://www.aygfsteel.com/human2008/archive/2008/01/11/174503.html??Fri, 11 Jan 2008 01:44:00 GMThttp://www.aygfsteel.com/human2008/archive/2008/01/11/174503.htmlhttp://www.aygfsteel.com/human2008/comments/174503.htmlhttp://www.aygfsteel.com/human2008/archive/2008/01/11/174503.html#Feedback0http://www.aygfsteel.com/human2008/comments/commentRss/174503.htmlhttp://www.aygfsteel.com/human2008/services/trackbacks/174503.html1.资料

2.本地事务与分布式事务

  • 本地事务
    完全依赖于DB、JMS自nQ,如直接调用jdbc中的conn.commit();q里没应用服务器什么事Q所以也不支持多数据源的全局事务?
  • 分布式事?/strong>
    在JavaEE世界的事务在JTA、JTS规范和XA Sources之上实现?br /> JTA是用L(fng)E接口,JTS是服务器底层服务Q两者一般由应用服务器自带实玎ͼ?span class="nobr">atomikos ?span class="nobr">JOTM ?span class="nobr">JBoss Transaction 是专门搞局抢生意的?br /> XA Sources其实先于JavaEE而存在,JDBC driver必须有javax.sql.XADataSource接口的实现类Q否则所谓二阶段提交是个伪能力?br /> JavaEE除了支持JDBC和JMS外,q引入了JCA模型。JCA可以说是目前唯一可移植的插入JavaEE事务的资源模型,因此像JDOq类框架/Server是靠乖乖出自己的JCAq接器来参与JavaEE事务的?/li>

3.~程式模?/h2>

    手工调用jdbc的connection事务Ҏ(gu)和用JTA接口都属于编E式开发,在EJB中叫BMT(Bean理事务)?br />     JTA最重要的接口就是UserTransaction和它的六个方?beginQcommitQrollbackQgetStatusQsetRollbackonlyQsetTransactionTimeout?br />     E序需要UserTransaction时可以从JNDI领取Q不qJNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入?/p>

4.宣告式模?/h2>

    前面都是铺垫Q这个才是主打的事务模型Q如EJB的CMT(容器理事务)和Sprin?/p>

    其中EJB2.0QSpring1.0在部|描q符和applicationContext.xml中定义,而EJB3.0和Spring2.0则采用annotation?/p>

4.1 事务cd

     q里JavaEE与Spring的定义基本相同:

  • RequiredQ如果Context中有事务加入,没有p己创Z个?最常用讄)
  • MandatoryQ永q加入一个事务。如果当前Context没有事务Q抛出异常?那些不打自p责rollback事务的方法,必须加入到别人的事务Q由别h来控制rollback)
  • RequiresNewQ永q新Z个事务?那些不管别h如何Q自己必L交事务的Ҏ(gu)Q比如审计信息是一定要写的)
  • SupportsQ如果有事务加入,如果没有q了。永q不会创建新事务?一般用于只L法,不会d创徏事务Q但如果当前有事务就加入Q以d事务中未提交的数?
  • NotSupportedQ永q不使用事务Q如果当前有事务Q挂起事务?那些有可能抛异常但异常ƈ不媄响全局的方?
  • NeverQ不能在有当前事务的情况下调用本Ҏ(gu)。(生h勿近?)

      可见QRequired是默认的讄QSupports是只L法的最佳选择?/p>

4.2 事务隔离U别

  • ReadUncommitedQ本事务可以看到另一事务未提交的数据。脏诅R?
  • ReadCommitedQ本事务只可以看到另一事务已提交的数据。不可重复读?
  • RepeatableReadQ可重复诅R在一个事务内Q第一ơ读到的数据Q在本事务没有提交前Q无论另一个事务如何提交数据,本事务读到的数据都是不变的?
  • SerializableQ串行化Q同时只有一个事务能ȝ同的数据?/li>

    U别低安全效率也低。隔ȝ别需要相兌源支持,如重复读在Oracle里会降为ReadCommited。Spring里默认的DefaultU别完全看数据源的脸色行事?/p>

4.3 关于Rollback

    EJB里,想rollback只能sessionContext.setRollbackOnly()Q或者抛出EJBException?EJB3q可以annotation讄某些自定义Exception可以触发rollback)

    在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子c?Q而checked exception(Exception及子c?是不会rollback的,除非你特别声明?/p>

   @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})

    因此所有在service层方法中用throws定义的ExceptionQ都必须在事务定义中q行rollback讑֮?请勿善忘)

    所有在service层方法中c被atch处理了的异常Q又希望容器辅助rollback的话Q必重抛一个预定义的RuntimeException的子cR?请勿回望)

4.4 关于Spring

    Spring不希望编E式事务理?br />     Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJOQ依赖于JTA全局事务对单数据源场景造成了浪费,而且rollback机制比较ȝQ必MؓEJBException或手工setRollbackOnly())?br />     因此Spring通过AOP实现了对POJO的整套宣告式事务体系Q对jdbc,hibernate,jpa,jms{local数据源和JTA实现了统一的事务管理机Ӟ而且支持本地资源与JTA在配|文件的切换,而且改进了rollback机制?/p>

   1Q一个本C务管理器Q?/p>

<bean id="transactionManager"  class="org.springframework.orm.jpa.JpaTransactionManager">  <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>

   2QSpring׃把请求都转发到应用服务器的JTA对象上(注意此时数据源也需要改为用JNDI从应用服务器获取)?/p>

<bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

   3Q应用服务器专有的类型的JTA事务理器:

<bean id="myTxManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>



? 2008-01-11 09:44 发表评论
]]>
可以开始用Struts2.0?/title><link>http://www.aygfsteel.com/human2008/archive/2008/01/08/173776.html</link><dc:creator>?</dc:creator><author>?</author><pubDate>Tue, 08 Jan 2008 12:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/human2008/archive/2008/01/08/173776.html</guid><wfw:comment>http://www.aygfsteel.com/human2008/comments/173776.html</wfw:comment><comments>http://www.aygfsteel.com/human2008/archive/2008/01/08/173776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/human2008/comments/commentRss/173776.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/human2008/services/trackbacks/173776.html</trackback:ping><description><![CDATA[Apache已经发布了Struts2.0的正式版Q即2.0.6GA版本。这个版本已l可以在目中正式用了。当然大家一定很兛_Q从webwork2.2q移到struts2.0ȝ不麻烦,L(fng)Struts2.0的FAQQ?<br /> <br /> <div id="wmqeeuq" class="quote_title">引用</div> <div id="wmqeeuq" class="quote_div">Essentially, Struts 2.0 is the technical equivalent of WebWork 2.3. Aside from the package and property renaming, it isn't much different than, say, migrating from WebWork 2.1 to 2.2.</div> <br /> <br /> Struts2.0其实是webwork2.3而已Q从webwork2.2q移到struts2.0不会比从webwork2.1?.2更麻烦?<br /> <br /> webwork2.2和struts2.0差异Ҏ(gu)Q?<br /> http://struts.apache.org/2.x/docs/key-changes-from-webwork-2.html <br /> <br /> q移步骤Q?<br /> http://struts.apache.org/2.x/docs/webwork-2-migration-strategies.html <br /> <br /> ȝQ?<br /> <br /> 大致来说Qstruts2.0是把package和配|文件的名字改了改而已Q别的没有做什么改动,所以现在用struts2.0和用webwork2.2没有多大区别。当然这q移一q就是将q两q_q是有点q步的: <br /> <br /> 1、搭配struts2.0的xwork版本必须使用xwork2.0.1Q而xwork2.0.1集成了可选的Google Guice IoC容器 <br /> 2、Struts2.0弄了一个plugin机制Q来适配各种扩展机制 <br /> 3、全面引入annotation语法Q验证,拦截都可以用annotation了?<br /> <br /> 所以用webwork的同志们Q大胆的q移到struts2.0来吧? <img src ="http://www.aygfsteel.com/human2008/aggbug/173776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/human2008/" target="_blank">?</a> 2008-01-08 20:21 <a href="http://www.aygfsteel.com/human2008/archive/2008/01/08/173776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank">崨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ͳ</a>| <a href="http://" target="_blank">ǧ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ع</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank">ī񹤿</a>| <a href="http://" target="_blank">˾</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˾</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ϻ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¤</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˴</a>| <a href="http://" target="_blank">׺</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ξ</a>| <a href="http://" target="_blank">γ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>