• Spring事务


    1:事务的概念
    事务是一系列作为一个逻辑单元来执行的操作集合
    他是数据库维护数据一致性的单位,他将数据库从一个一致状态,转变为新的另外一个一致状态
    说的简单一点就是:如果一组处理步骤要么全部成功,要么全部失败,这样就保证了 数据始终一个状态,维护了数据的完整和可靠
     
    2:jdbc处理事务的逻辑:
    详见jdbc事务.png
     
    3:事务的属性:
    事务的4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。
    * 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的所有操作要么都做,要么都不做。
    * 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    * 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    * 持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
     
    4:事务的传播特性指不同事务的方法在相互调用时,执行期间事务的维护情况
    一般有两种方式:
    * PROPAGATION_REQUIED:如果存在一个事务,则支持当前事务,如果没有事务则开启
    * PROPAGATION_REQUIED_NEW:总是开启一个新事务
     
    5:事务管理的类型:
    事务管理分为两种类型,分为编程式事务和声明式事务
    编程式事务管理可以清楚的定义事务的边界
    可以实现细粒度的事务控制,开发者可以通过程序代码来控制你的事务何时开始何时结束,类似于jdbc事务.png,但是事务的控制和业务代码耦合在一起,不能共用,开发效率低,不便于维护
    声明式事务
    声明式事务可以结合spring AOP的概念,只需要通过配置在指定的方法中加入事务控制
    如果需要修改或者删除事务,移除配置即可,解除了系统服务(事务)与业务代码的耦合,而且方便管理,在实际开发中,一般提倡用声明式事务管理
     
    6:spring跟事务的关系
    * 事务原本是数据库中的概念,是在dao层,但是一般情况下,我们会把事务管理提升到我们的业务层(service),这是为了更好的用事务来管理我们的业务逻辑
    * spring并不直接管理事务,而是提供了多种事务管理器,根据不同的数据应用方式,(jdbc(自定义封装的jdbc,jdbctemplate,mybatis)/hibernate)提供了对应的事务管理器,所有的事务管理器实现了一个共同的接口,org.springframework. transaction.PlatformTransactionManager,他提供了三个方法 commit rollback getTransaction(TransactionDefinition(用来定义事务的一系列属性))
     
    7:Spring实现事务有三种方式
    * 基于xml配置
    * 注解
    * aspectJ
     
    8:模拟转账
     
    9: spring基于xml配置实现事务
    * 环境搭建:引入jar,引入aop约束
    aopalliance-1.0.jar
    spring-aop-4.2.1.RELEASE.jar
    spring-tx.jar
    * xml配置事务
    <!-- 注册事务管理器 -->
    <bean id = "txMgr" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref = "dataSource"></property>
    </bean>
     
    <!-- 注册事务代理 -->
    <bean id = "transProxy" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref = "txMgr"></property>
    <property name="target" ref= "accountService"></property>
    <property name="transactionAttributes">
    <props>
    <!-- 隔离属性,出错之后事务回滚 -->
    <prop key="operate*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>
     
    10: spring注解方式实现事务
    在第九步的基础上引入tx约束
    <!-- 开启事务的注解驱动 -->
    <tx:annotation-driven transaction-manager="txMgr"/>
    在方法上加上 @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
    11: spring AspectJ实现事务
    <!-- 注册事务管理器 -->
    <bean id = "txMgr" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref = "dataSource"></property>
    </bean>
    <!-- 注册通知 -->
    <tx:advice id = "txAdvice" transaction-manager="txMgr">
    <tx:attributes>
    <tx:method name="oper*" isolation="DEFAULT" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice>
    <!-- aop配置,切入点表达式和通知匹配 -->
    <aop:config>
    <aop:pointcut expression="execution(* *..AccountService.*(..))" id="accountPointcut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="accountPointcut"/>
    </aop:config>
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Context对象还提供了相应的属性来调整线条及填充风格
    基本类型互相之间转化可以用Covent类来实现。
    chfn是用来改变你的finger讯息
    在Web根目录下建立testdb.php文件内容
    springmvc接口接收json类型参数设置
    表单类型参数样板
    git push 免密码
    git提交之后没有push,代码被覆盖之后恢复
    测试流程总结
    linux 更改时区
  • 原文地址:https://www.cnblogs.com/wadmwz/p/7628871.html
Copyright © 2020-2023  润新知