花钱的年华

--今天开始成为主站

肖桦ID:calvinxiu
664326次访问,排名51好友0人,关注者30
calvinxiu的文章
原创 156 篇
翻译 0 篇
转载 0 篇
评论 642 篇
江南白衣的公告

肖桦,江南白衣,开源项目SpringSide--春天的旁边发起者

最近评论
fbysss:看看谁占满了Heap?
用JDK6的jmap可以显示运行程序中对象的类型,个数与所占的大小

有时间去试一下
Henrik:Stag应为Stage
Event Handler ,实际处理业务的Compinent。疑似component
ASP_lover:




强烈推荐 大家访问: www.soAsp.net 编程学习技术资料网,有很多技术资料,而且技术资料都很不错!











rainshow:GC Detail不合法很正常啊,呵呵
GC D嘛
handong5403:“SpringSide 3.0的开发过程(还在SVN中时时修订)便是Agile UP式的普通剪裁,以UP为底色和框架(下),在构建阶段中融入大量敏捷实践(上),美好一如下图:”


这个……看不明白,图的意思……
文章分类
    收藏
      相册
      Blog用图
      Friends
      @_@
      Anders小明
      buaawhl
      cac
      canonical
      cctvx1
      david.turing
      femto
      g9
      JohnsonQu
      Michael Chen
      Raimundox
      robbin
      SimonLei
      totodo
      wuyu
      周爱民
      孟岩
      差沙
      庄表伟
      落魄的程序员
      透明
      郁也风
      铁手
      银狐999
      飞云小侠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 JavaEE事务扫盲笔记之一扫扫到尾收藏

      新一篇: 设计美好的服务器(5)--Shoal集群框架  | 旧一篇: 数据服务笔记

      音箱里放的是《暮良文王》、《相相生》,再看下面的笔记体,虽然实用,但还是数完盘来再数碟,言语无味的很。以后不是这里的地荒得太厉害,就尽量让这些笔记在wiki里安静的呆着吧。

      1.资料

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

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

      3.编程式模型

          手工调用jdbc的connection事务方法和使用JTA接口都属于编程式开发,在EJB中叫BMT(Bean管理事务)。
          JTA最重要的接口就是UserTransaction和它的六个方法-begin,commit,rollback,getStatus,setRollbackonly,setTransactionTimeout。
          程序需要UserTransaction时可以从JNDI领取,不过JNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入。

      4.宣告式模型

          前面都是铺垫,这个才是主打的事务模型,如EJB的CMT(容器管理事务)和Sprin。

          其中EJB2.0,Spring1.0在部署描述符和applicationContext.xml中定义,而EJB3.0和Spring2.0则采用annotation。

      4.1 事务类型

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

      • Required:如果Context中有事务就加入,没有就自己创建一个。(最常用设置)
      • Mandatory:永远加入一个事务。如果当前Context没有事务,抛出异常。(那些不打算自己负责rollback事务的方法,必须加入到别人的事务,由别人来控制rollback)
      • RequiresNew:永远新建一个事务。(那些不管别人如何,自己必须提交事务的方法,比如审计信息是一定要写的)
      • Supports:如果有事务就加入,如果没有就算了。永远不会创建新事务。(一般用于只读方法,不会主动创建事务,但如果当前有事务就加入,以读到事务中未提交的数据)
      • NotSupported:永远不使用事务,如果当前有事务,挂起事务。(那些有可能抛异常但异常并不影响全局的方法)
      • Never:不能在有当前事务的情况下调用本方法。(生人勿近?)

            可见,Required是默认的设置,Supports是只读方法的最佳选择。

      4.2 事务隔离级别

      • ReadUncommited:本事务可以看到另一事务未提交的数据。脏读。
      • ReadCommited:本事务只可以看到另一事务已提交的数据。不可重复读。
      • RepeatableRead:可重复读。在一个事务内,第一次读到的数据,在本事务没有提交前,无论另一个事务如何提交数据,本事务读到的数据都是不变的。
      • Serializable:串行化,同时只有一个事务能读相同的数据。

          级别越低越安全效率也越低。隔离级别需要相关资源支持,如重复读在Oracle里会降级为ReadCommited。Spring里默认的Default级别完全看数据源的脸色行事。

      4.3 关于Rollback

          EJB里,想rollback只能sessionContext.setRollbackOnly(),或者抛出EJBException。(EJB3还可以annotation设置某些自定义Exception可以触发rollback)

          在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子类),而checked exception(Exception及子类)是不会rollback的,除非你特别声明。

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

          因此所有在service层方法中用throws定义的Exception,都必须在事务定义中进行rollback设定。(请勿善忘)

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

      4.4 关于Spring

          Spring不希望编程式事务管理。
          Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJO,依赖于JTA全局事务对单数据源场景造成了浪费,而且rollback机制比较麻烦(必须为EJBException或手工setRollbackOnly())。
          因此Spring通过AOP实现了对POJO的整套宣告式事务体系;对jdbc,hibernate,jpa,jms等local数据源和JTA实现了统一的事务管理机制,而且支持本地资源与JTA在配置文件级的切换,而且改进了rollback机制。

         1)一个本地事务管理器:

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

         2)Spring就会把请求都转发到应用服务器的JTA对象上(注意此时数据源也需要改为用JNDI从应用服务器获取)。

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

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

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

         

      发表于 @ 2007年11月21日 21:07:00|评论(loading...)|编辑

      新一篇: 设计美好的服务器(5)--Shoal集群框架  | 旧一篇: 数据服务笔记

      评论

      #bbb 发表于2007-11-24 19:49:40  IP: 123.112.109.*
      老大你的springside3还继续么.
      spring2.5都出来了,貌似没有我们期待的泛型dao和分页
      #calvinxiu 发表于2007-11-26 17:04:58  IP: 58.63.47.*
      有继续啊,你更新一下Subversion:)

      争取下个月初发个版本。
      #小献 发表于2007-12-02 18:35:35  IP: 60.191.227.*
      不错啊,学习啊
      #小弟 发表于2008-04-21 13:02:13  IP: 218.2.115.*
      江南老大!springside网站什么时候可以再打开啊!!
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © 江南白衣