• java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate


    java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate等.

    ================================================================================

    事物处理:

    1、事务处理简介
      >>事务:一系列步骤组成的有机集合。
      >>事务特性:ACID
        原子性:表示事务执行过程中,把事务作为一个工作单元处理,一个工作单元可能包括若干个操作步骤,每个操作步骤都必须完成才算完成,若因任何原因导致其中一个,则表示此操作失败,前面完成的步骤必须回滚,系统回到事务开始前的状态。
        一致性:如果事务开始跟事务结束时系统都处理一致状态,无论事务成功还是失败。原因:必须保证事务操作的数据一致。
        隔离性:2个事务在操作过程中是相互独立的,互不相干。
        持久性:事务执行成功后,在系统中产生的结果应该是持久的。
     
    2、事务处理
       有3种方式:
      >>关系型数据库的事务处理
      >>传统的JDBC事务处理
      >>分布式事务处理
      本文重点放在   第二中传统的事务处理
    public class HelloWorld{
     private DataSource dataSource;
     //获取数据源
     public void setDataSource(DataSource dataSource){
     this.dataSource = dataSource;
     }
     Connection conn = null;
     Statement stmt = null;
     try{
     //获取数据连接
     conn = dataSource.getConnection();
     //开始事务
     conn.setAutoCommit(false);
     stmt = conn.createStatement();
     //执行想要操作
     stmt.executUpdat(...);
     //执行成功则提交事务
     conn.commit();
     }catch(....){
     if(conn != null){
     //执行不成功,则回滚
     conn.roolback();
     }catch(...){...}
     }finally{...}
    }
    以上是传统到不能再传统的jdbc对事务的处理,权当对jdbc一次复习,接下来是如何通过Spring实现对事务的处理。
    Spring对事务的处理可分2种方式实现 
    1:编程式事务处理
    2:声明式事务处理
    扯一下spring对事务处理的原理:
    Spring中事务处理实际上是基于动态AOP机制实现的,默认情况下,spring使用java动态代理机制,如果代理对象并没有实现摸一个接口,Spring则通过cglib实现,此时必须添加执行cglib的jar包。
    统一介绍事务api
    spring事务中心接口:
    org.springframework.transaction.PlatformtransactionManager
     
    public interface PlatformTransactionManager{
     //目前的事务
     TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
     //提交事务
     void commit(TransactionStatus status) throws TransactionException;
     //事务回滚
     void rollback(TransactionStatus) throws TransactionException;
    }
     
    TransactionDefinition
    代表事务处理时一些属性定义,如事务名称,隔离层次 传播行为 等等
    public interface TransactionDefinition{
     //获得事务的传播行为
     int getPropagationBehavior();
     //获得事务的隔离层次
     int getsolationLevel();
     //判断事务是否超时
     int getTimeour();
     //是否为只读事务
     boolean isReadOnly();
     //返回一个事务的名字
     String getName();
    }
     
    TransactionStatus
    代表目前的事务,通常不直接使用它,可以借助它的setRollbackOnly方法设定只读事务。
    public interface TransactionStatus{
     //判断是否是一个新事务
     boolean isNewTransaction();
     //设定为只读事务
     void setRollbackOnly();
     //判断是否是只读事务
     boolean isRollbackOnly();
     //判断一个事务是否完成
     boolean isCompleted();
    }
    事务处理模板
    TransactionTemplate
    TransactionTemplate extends DefaultTransactionDefinition implements InitializingBean{
     private PlatformTransactionManager tranactionManger = null;
     //通知依赖注入
     publc TransactionTemplate(PlatformTransactionManager transactionManager){
     this.transactionManager = transactionManager;
     }
     public void setTransactionManager(PlatformTransactionManager transaction transactionManager){
     this.transactionManger = transactionManager;
     }
     public PlatformTransactionManager getTransactionManager){
     return transactionManager;
     }
     //执行完毕后调用
     public void afterPropertiesSet(){
     if(this.transactionManager == null){
     throw new IllegalArgumentException("xxxxx");
     }
     }
     //在这里进行事务处理
     public Object execute(TransactionCallback action) throws TransactionException{
     TransactionStatus status = this.transactionManager.getTransaction(this);
     Object result = null;
     try{
     //执行具体方法
     result = action.doInTransaction(status);
     }catch(RuntimeException ex){
     rollbackOnException(status, ex);
     throw ex;
     }catch(Error err){
     rollbackOnException(status, err);
     throw err;
     }
     this.transactionManager.commit(status);
     return result;
     }
     
     //如果有异常就rollback
     private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException{
     try{
     this.transactionManager.rollback(status);
     }catch(RuntimeException ex2){
     throw ex2;
     }catch(Error err){
     throw err;
     }
     }
    }
     
    在有上面的api基础上,利用TransactionTemplate来实现事务处理。具体实例如下
    >>>编程式事务处理
     
    publc class HelloDAO{
     private DataSource dataSource;
     private PlatformTransactionManager transactionManager;
     //通过依赖注入来完善管理
     public void setDataSource(DataSource dataSource){
     this.dataSource = dataSource;
     }
     public void setTransactionManager(PlatformTransactionManager transactionManager){
     this.transactionManager = transactionManager;
     }
     //该方法进行事务处理
     public int create(String msg){
     TranactionTemplate transactionTemplate(transactionManager);
     Object result = transactionTemplate.execute(new TransactionCallback(){
     public Object doInTransaction(TransactionStatus status){
     //执行操作
     return resultObject;
     }
     });
     }
    }
    >>设置配置xml文件
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     <!--使用SQLServer数据库-->
     <property name="driverClassName">
     <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
     </property>
     <!--设定url-->
     <property name="url">
     <value>jdbc:microsoft:sqlserver://localhost:1433/stdb</value>
     </property>
     <!--设定用户名-->
     <property name="name">
     <value>sa</value>
     </property>
     <!--密码-->
     <property name="msg">
     <value>123</value>
     </property>
    </bean>
    <!--设定transactionManager-->
    <bean id="transactinManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource">
     <ref bean="dataSource">
     </property>
    </bean>
    <!--示例中的一个dao-->
    <bean id="helloDAO" class="com.langfei.xxxx.HelloDAO">
     <property name="dataSource">
     <ref bean="dataSource">
     </property>
     <property name="transactionManager">
     <ref bean="transactionManager"/>
     </property>
    </bean>
    说明一下:id为dataSource的bean,是采用DriverManagerDataSource的数据源
     
    >>>声明式事务处理
    1、添加aopallinace.jar
           cglib-nodep.jar
     
    >>事例
    public class HelloDao{
     private DataSource dataSource;
     privata JdbcTemplate jdbcTemplate;
     
     //依赖注入
     public void setDataSource(DataSource dataSource){
     this.dataSource = dataSource;
     jdbcTemplate = new JdbcTemplate(dataSource);
     }
     //注意这里看不到事务处理的代码,都在配置文件中
     public void create(String sql){
     jdbcTemplate.update(sql);
     }
    }

     
    >>具体xml文件配置
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManageDataSource">
     <!--使用SQLServer数据库-->
     <property name="driverClassName">
     <value>com.microsof.jdbc.sqlserver.SQLServerDriver</value>
     </property>
     <!--设定URL-->
     .....
     <!--设定用户名-->
     ....
     <!--设定密码-->
     ....
    </bean>
     
    <!--设定transactionManager-->
    ....
    <bean id="transactionManager">
    </>
    .....
     
    <!--Dao-->
    。。。。。

    上面的具体配置跟编程式的一样,就简写啦,不同的在下面。
     
    <!--声明事务处理-->
    <bean id="helloDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     <property name ="transactionManager">
     <ref bean="transactionManager"/>
     </property>
     <!--指明代理的是HelloDAO类-->
     <property name="target">
     <ref bean="helloDAO">
     </property>
     
     <property name="transactionAttributes">
     <props>
     <!--表示HelloDAO中的create()方法进行事务管理,并指明如果当前没有事务,就新建一个事务-->
     <prop key="create">PROPAGATION_REQUIERD</prop>
     </props>
     </property>
     
     <!--
     PROPAGATION_REQUIRED: 如果当前没有事务,就新建一个事务
     PROPAGATION_SUPPORTS: 如果当前没有事务,就以非事务方式执行
     PROPAGATION_MANDATORY: 如果当前没有事务,就抛出异常
     PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
     PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
     PROPAGATION_NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常
     
     -->
    </bean>
  • 相关阅读:
    [LeetCode]Surrounded Regions
    生产者消费者问题
    多线程试题汇总
    Linux多线程编程
    运算符优先级表
    正向代理和反向代理
    遗传算法
    嵌入式培训学习历程第十五天
    嵌入式培训学习历程第十四天
    一个猜数的游戏
  • 原文地址:https://www.cnblogs.com/jsStudyjj/p/5203116.html
Copyright © 2020-2023  润新知