文档详情

Spring高级事务管理难点难点剖析.ppt

发布:2017-05-02约4.85千字共27页下载文档
文本预览下载声明
* * * * * * * * * * * * * * * * * * * * * * Spring高级事务管理 难点剖析 1-1:DAO和事务管理的牵绊 问题: 很少使用Spring但不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用Spring事务管理器,否则就无法进行数据的持久化操作呢?事务管理器和DAO是什么关系呢? 1-2:DAO和事务管理的牵绊 真相: 答案当然是否定的!我们都知道:事务管理是保证数据操作的事务性(即原子性,一致性,隔离性,持久性,也即所谓的ACID),脱离了事务性,DAO照样可以顺利地进行数据的操作。 2-1:应用分层的迷惑 问题: Web,Service及DAO三层划分就像西方国家的立法、行政、司法三权分立一样被奉为金科玉律,是否要使用Spring的事务管理就一定先要进行三层的划分呢?是否每一层都需要有接口+实现类呢? 2-2:应用分层的迷惑 真相: 应用代码分层和Spring的事务管理是两回事,没有应用分层照样可以进行Spring事务管理。Spring的事务管理也不依赖于接口+实现类的开发模式。 3-1:事务方法嵌套调用的迷茫 问题: 一个事务方法调用另一个事务方法会产生两个事务,还是只有一个事务? 3-2 认识TransactionDefinition int getPropagationBehavior():事务的传播行为 int getIsolationLevel():事务的隔离级别 int getTimeout():事务的过期时间 boolean isReadOnly():事务的读写特性。 很明显,除了事务的传播行为外,事务的其它特性Spring是借助底层资源的功能来完成的,Spring无非只充当个代理的角色。但是事务的传播行为却是Spring凭借自身的框架提供的功能 3-3 Spring事务传播行为 ?PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 ?PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 ?PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。 ?PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 ?PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 ?PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 ?PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7种事务传播行为 3-4:事务方法嵌套调用的迷茫 真相: Spring默认的事务传播行为是PROPAGATION_REQUIRED,它适合于绝大多数的情况。假设ServiveX#methodX()都工作在事务环境下(即都被Spring事务增强了),假设程序中存在如下的调用链:Service1#method1()-Service2#method2()-Service3#method3(),那么这3个服务类的3个方法通过Spring的事务传播机制都工作在同一个事务中。 4-1:多线程的困惑 问题: 如果在一个ServiceA和a()方法中启动一个线程,在这个新创建的线程中执行ServiceB的事务方法b(),ServiceA的 a()方法和ServiceB的b()方法是工作在同一事务环境中,还是分别拥有一个独立的事务呢? 4-2:多线程的困惑 真相: 在相同线程中进行相互嵌套调用的事务方法工作于相同的事务中。如果这些相互嵌套调用的方法工作在不同的线程中,不同线程下的事务方法工作在独立的事务中。 5-1:联合军种作战的混乱 问题: Hibernate,Spring JDBC,iBatis等多种数据持久方法如何联合使用,会存在哪些问题,如何进行事务管理的配置? 5-2:如何配置事务管理器 如果你采用了一个高端ORM技术(Hibernate,JPA,JDO),同时采用一个JDBC技术(Spring JDBC,iBatis),由于前者的会话(Session)是对后者连接(Connection)的封装,Spring会“足够智能地”在同一个事务线程让前者的会话封装后者
显示全部
相似文档