SpringMVC+MyBatis 事务管理二

前言

   
 上篇重要从编程式事务与声明式事务注解的样式来询问了作业,而及时首我们本着AOP的点子来落实业务。先想起下作业之基础知识事务之断级别和作业的散播行为。使用aop
配置事务时只顾引用aspectjweaver,要不然程序启动起来就会见报错,找不交彼此关类

 

政工隔离级别

断级别是据多少单冒出的业务中的隔离程度。TransactionDefinition
接口中定义了五单象征隔离级别的常量:

  • TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示用底层数据库的默认隔离级别。对大部分数据库而言,通常就值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事情可以读取另一个政工修改只是还没交的数。该级别不可知防范脏读和不可再读,因此非常少使用该隔离级别。
  • TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个业务只能读取另一个事务都交付的数目。该级别可以防水污染读,这吗是大部分情形下之推荐值。
  • TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个政工在整个过程被可多次重复执行有查询,并且每次回来的笔录都平等。即使在勤查询之间时有发生新增的数据满足该查询,这些新增的笔录也会见让忽视。该级别可以防脏读和不得再读。
  • TransactionDefinition.ISOLATION_SERIALIZABLE:所有的工作逐项逐个执行,这样工作中便净不容许出干扰,也就是说,该级别可以防止污染读、不可再读与幻读。但是这将严重影响程序的属性。通常情况下呢非会见用到拖欠级别。

工作传播行为

所谓事务的传入行为是靠,如果以初始时工作之前,一个工作及下文已经在,此时发生好多选择可以指定一个事务性方法的履行行为。在TransactionDefinition定义着连了如下几独象征传播行为之常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果手上存业务,则投入该事情;如果手上尚无事情,则开创一个新的作业。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个初的事务,如果手上存工作,则拿当下政工挂于。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果手上在工作,则加入该业务;如果手上尚未工作,则坐非事务的措施持续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果手上存在工作,则把目前事情挂于。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果手上留存业务,则弃来非常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果手上在工作,则投入该事情;如果手上并未工作,则抛来好。
  • TransactionDefinition.PROPAGATION_NESTED:如果手上设有工作,则开创一个事情作为当下政工之嵌套事务来运转;如果手上莫事情,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

行使AOP实现事务管理

<!--配置数据源,这里使用Spring默认-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${sqlserver.driver}"/>
        <property name="url" value="${sqlserver.url}"/>
        <property name="username" value="${sqlserver.username}"/>
        <property name="password" value="${sqlserver.password}"/>
    </bean>

    <!--配置sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:springmvc-mybatis.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--扫描mapper-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.autohome.dao"/>
    </bean>

    <!--事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*"  isolation="DEFAULT" propagation="REQUIRED"/>
            <tx:method name="*" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <!--只对业务逻辑层开启事务-->
    <aop:config expose-proxy="true">
        <aop:pointcut id="txPointcut" expression="execution(* com.autohome.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>

   
 运行action后,console会打印入库成功的唤起,从数据库里询问其实数据就回滚。

 

总结

     
 以上两首总结了事情两种配备方式,编程式事务和声明式事务,而打用的角度来拘禁@Transactional注解属性最简单易行吗不过实用,aop的主意控制更细致些。同时回顾了基础知识事务传播性与隔离级别,这有限单地方不好理解,平时解除的事体解除相对也生好,还要继续寻找和demo。

 

参考

https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/index.html

网站地图xml地图