zoukankan      html  css  js  c++  java
  • Spring事务管理

    1:

      Spring事务管理高层抽象主要包括了3个接口:PlatformTransactionManager(事务管理器) 、 TransactionDefinition(事务定义信息 隔离 传播 超时 只读)、TransactionStatus(事务具体运行状态)

      Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现:HibernateTransactionManager使用Hibernate进行持久化数据时使用,DataSourceTransactionManager使用Spring JDBC或iBatis进行持久化数据时使用。

      事务的四大特性:原子性、一致性、隔离性、持久性 ACID.

      在不考虑隔离性会引发安全问题:脏读、不可重复读、幻读。

        事务隔离级别:read_unconmited read_conmited repeatable_read serializable

        脏读:一个事务读取了另一个事务改写但未提交的数据,一旦回滚,读到的数据是无效的。

        不可重复读:在同一个事务中,多次读取同一个数据返回的结果不同。

        幻读:是对插入记录而言,读取了几行之后,发现了别的事务插入的数据。

      事务的传播行为:结局业务层方法之间相互调用的问题。

        propagation_required 支持当前事务,如果不存在,就新建一个(两个事务在一起)

        propagation_required_new 如果有事务存在,挂起当前事务,创建一个新事务(两个事务不在一起)

        propatation_nested 如果当前事务存在,则嵌套事务执行

    2.

      Spring事务一定在配置文件中创建事务的bean,只有这样才能引入事务。JDBC用的是DataSouceTransactionManager,Hibernate用的是HibernateTransactionManager 前者通过dataSource指定事务,后者通过SessionFactory指定事务。

      Spring将事务分成了两类:编程式事务管理 声明式事务管理 。但这些都是对事务功能的增强,总体需指明事务的propagation isolation以及对哪些方法添加事务功能

      声明式事务管理:

      1)注解

      在配置文件中

    <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

      直接在业务层类上加@Transactional() 在括号中指定隔离级别 传播行为等

    @Transactional
    public class AccountBizImpl implements AccountBiz

      2)AspectJ

      一定要先导入jar包,目前用的是aopalliance-1.0.jar、aopalliance-1.0-sources.jar、aspectjrt.jsr、aspectjtools.jar、aspectjewaver.jar、org.aspectj.matcher.jar。

      在配置文件中

    <!-- 配置事务的通知:(事务的增强) -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!--
    Propagation :事务的传播行为
    Isolation :事务的隔离级别
    read-only :只读
    timeout :过期信息
    rollback-for :哪些异常回滚
    no-rollback-for :哪些异常不回滚
    -->

    <tx:method name="transfer" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>

    <!-- 配置切面(aspect是多个切入点,多个通知;advisor是一个切入点,一个通知 -->
    <aop:config>
    <aop:pointcut expression="execution(* com.zhao.biz.AccountBiz+.*(..))" id="pointcut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>

      3)TransactionProxyFactoryBean

      创建代理类,在这里指明事务  事务管理器 以及在哪个类中应用这些设置

    <!-- 配置业务层的代理 -->
    <bean id="accountBizProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!-- 配置目标对象 -->
    <property name="target" ref="accountBiz"></property>
    <!-- 注入事务管理器 -->
    <property name="transactionManager" ref="transactionManager"></property>
    <!-- 注入事务属性 -->
    <property name="transactionAttributes">
    <props>
    <!-- prop格式 :
    *PROPAGATION :事务的传播行为
    *ISOLATION :事务的隔离级别
    *readOnly :只读(不可用进行修改,插入,删除)
    *-Exception :发生哪些异常回滚事务
    *+Exception :发生过哪些异常事务部回滚
    -->
    <prop key="transfer">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>

      编程式事务管理:

      自定义transactionTemplate 在方法主体中调用它的exexute方法。

      在配置文件中

    <!-- 配置事务管理模板(Spring为了简化事务管理的代码而提供的类 -->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
    </bean>

      在业务逻辑类中

    /*
    * 注入事务管理的模板 private TransactionTemplate template; public
    * voidsetTemplate(TransactionTemplate template) { this.template = template;
    * }
    */

    @Override
    public void transfer(String out, String in, Double money) {
    // TODO Auto-generated method stub

    // 编程式的事务管理(在匿名内部类中使用了out,in变量,所以要给其加上final关键字

     template.execute(new TransactionCallbackWithoutResult() {

     @Override protected void
     doInTransactionWithoutResult(TransactionStatus status) {

    // TODO * Auto-generated method stub

      accountDAO.outMoney(out, money);  

      int i=1/0;

       accountDAO.inMoney(in, money);

       }

    });

      

  • 相关阅读:
    Sails v1.0使用指南
    sails0.12相关命令
    vs code 快捷键
    nodejs相关框架
    sails 相关软件下载地址及命令
    UltraISO安装windows10时0x8007000D错误解决办法
    C# HtmlElement的GetAttribute("class") return ""
    Android如何实现TCP和UDP传输
    android 获取view在屏幕中的位置
    八款Android 开发者必备的小工具
  • 原文地址:https://www.cnblogs.com/zhao307/p/5339283.html
Copyright © 2011-2022 走看看