zoukankan      html  css  js  c++  java
  • 事务

    在程序行下文中声明一个事务管理器

    jdbc事务管理器

    DataSourceTransactionManager通过datasource检索到java.sql.Connection 对象来管理事务,一个成功的事务调用当前连接commit()提交,一个失败的事务通过rollbck()回滚

    <bean id="transactionManager" class="org.springframework.jdbc.
    datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/>
    </bean>

    jpa事务管理器

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

    jto事务管理器

    <bean id="transactionManager" class="org.springframework.
    transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" />
    </bean>

    程序中使用事务管理器

    public void saveSpittle(final Spittle spittle) {
      transactionTemplate.execute(new TransactionCallback<Void>() { //使用transctiontemplate,必须实现transactioncallback接口,该接口中只有一个function
        public Void doInTransaction(TransactionStatus txStatus) {
          try {
          spitterDao.saveSpittle(spittle);
          } catch (RuntimeException e) {
            txStatus.setRollbackOnly(); //回滚
    throw e; }
          return null;
        }
    }); }

    声明式事务

    来源百度百科:声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。

       Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。

      Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:

    1.传播行为

    2.隔离级别

    脏读: a事务写数据但未提交,b事务读取,a事务回滚,b读取的数据无效

    不可重复读:a事务读取两次数据结果不同,可能另一并发事务在两次查询中改写数据

    幻读取:事务在查询多条记录的过程中,数据被改写。

    隔离级别:

    SOLATION_DEFAULT 默认级别
    ISOLATION_READ_UNCOMMITTED 允许读取尚未更改的数据,级别最低
    
    ISOLATION_READ_COMMITTED 允许从已提交的并发事务中读取数据,可防止脏读,不可防止不可重复读和幻读
    
    ISOLATION_REPEATABLE_READ 对相同字段的多次读取结果一致,不可防止幻读
    
    ISOLATION_SERIALIZABLE 完全锁定当前事务涉及的table,级别最高,但是最慢
    

    3.只读提示 

    如果事务只读取数据,数据库可优化,由后端数据库实施

    4.事务超时期间

    5. 回滚规则

    定义哪些异常可引起回滚

     

    声明事务

    1 在spring2.0中声明事务

    <tx:advice id="txAdvice" transaction-manager="txManager"> //使用tx命名空间
      <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED" />
        <tx:method name="*" propagation="SUPPORTS"
            read-only="true"/>
      </tx:attributes>
    </tx:advice>
    <aop:config> //通知器,定义接受通知的bean
      <aop:advisor
          pointcut="execution(* *..SpitterService.*(..))"//实现spitterservice的所有的接口的bean
          advice-ref="txAdvice"/> 
    </aop:config>

    The five facets of the transaction pentagon are specified in the attributes of the <tx:method> element.

    propagation 事务的传播规则isolation 事务的隔离级别

    read-only 是否为只读

    rollback-for 那该异常应该回滚

    no-rollback-for 对于哪些异常当前事务应该继续执行而不回滚

    timeout 事务超时时间

     

    2 通过注解声明事务

    在应用程序上下文中加入

    <tx:annotation-driven transaction-manager="txManager" />
    

    该注释告诉spring在类层或者方法层检查程序上下文的所有bean,寻找标注@transactional的bean,tx:annotation-driven 将自动把事务通知的内容给他

    可注释在一个类上或一个接口或一个方法上

       @Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
            public class SpitterServiceImpl implements SpitterService {
            ...
              @Transactional(propagation=Propagation.REQUIRED, readOnly=false)
              public void addSpitter(Spitter spitter) {
            ...
    } ...
    }
  • 相关阅读:
    词法分析
    HTTP学习笔记
    Servlet入门
    UDP与TCP的区别
    C语言实现血型查询系统
    Mysql的索引、回表查询及覆盖索引浅析
    ReentranLock浅析
    CAS是个什么鬼?
    synchronize和volatile 小知识点总结
    写一个简单的阻塞队列
  • 原文地址:https://www.cnblogs.com/zengyou/p/2777345.html
Copyright © 2011-2022 走看看