• Spring学习笔记


    http://test-touch.iteye.com/blog/1490833

    Spring学习笔记(三)-事务

    博客分类: spring
    springspring事务

    事务管理
    仅用四个词解释事务

    atomic(原子性):要么都发生,要么都不发生。
    consistent(一致性):数据应该不被破坏。
    Isolate(隔离性):用户间操作不相混淆
    Durable(持久性):永久保存,例如保存到数据库中等

    Spring提供了两种事务管理方式:
    编程序事务管理
    声明式事务管理


    编程序事务管理
    编写程序式的事务管理可以清楚的定义事务的边界,可以实现细粒度的事务控制,比如可以通过程序代码来控制你的事务何时开始,何时结束等,与下面的声明式事务管理相比,它可以实现细粒度的事务控制。

    声明式事务管理
    如果并不需要细粒度的事务控制,可以使用声明式事务,在Spring中,只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合,这是对应用代码影响最小的选择,从这一点再次验证了Spring关于AOP的概念。当不需要事务管理的时候,可以直接从Spring配置文件中移除该设置.需要引入用于事务管理的命名空间(tx).
    Spring并没有直接管理事务,而是将事务的管理委托给其他的事务管理器实现.
    Spring支持的事务管理器:

    org.springframework.jdbc.datasource.DataSourceTransactionManager (在单一的JDBC Datasource中的管理事务)
    org.springframework.orm.hibernate3.HibernateTransactionManager (当持久化机制是hibernate时,用它来管理事务)
    org.springframework.jdo.JdoTransactionManager (当持久化机制是Jdo时,用它来管理事务)
    org.springframework.transaction.jta.JtaTransactionManager (使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用)
    org.springframework.orm.ojb.PersistenceBrokerTransactionManager (当apache的ojb用作持久化机制时,用它来管理事务)
    基于XML文件配置事务管理器:
    <!--1 配置数据源-->
    <bean id="dateSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="maxActive" value="100"/>
    <!-- 初始化连接数 -->
    <property name="initialSize" value="5"/>

    <!--最大空闲数,当洪峰退去时, 连接池所放的最少连接数-->
    <property name="maxIdle" value="8"/>

    <!--最小空闲数,当洪峰到来时,引起的性能开销 -->
    <property name="minIdle" value="5"/>
    </bean>

    <!--2 配置JdbcTemplate模板,类似于dbutils,可数据访问操作-->
    <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 给JdbcTemplate注入数据源,调用JdbcAccessor中的setDataSource(DataSource dataSource)注入数据源-->
    <property name="dataSource" ref="dateSource"/>
    </bean>


    <!-- 3 声明事务管理器(实际上,事务管理器就是一个切面),事务管理器将在获取连接时,返回一个打开事务的连接 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 注入数据源,spring的jdbc事务管理器在管理事务时,依赖于JDBC的事务管理机制 -->
    <property name="dataSource" ref="dateSource"/>
    </bean>

    <!-- 4 配置通知
    id="advice":该属性的值就是通知的唯一标识
    transaction-manager:表示通知织入哪个切面
    -->
    <tx:advice id="advice" transaction-manager="txManager">
    <tx:attributes>
    <!-- tx:method的属性:
    * name 是必须的,表示与事务属性关联的方法名(业务方法名),对切入点进行细化。通配符(*)可以用来指定一批关联到相同的事务属性的方法。
    如:'get*'、'handle*'、'on*Event'等等.
    * propagation 不是必须的 ,默认值是REQUIRED
    表示事务传播行为, 包括REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED
    * isolation 不是必须的 默认值DEFAULT
    表示事务隔离级别(数据库的隔离级别)
    * timeout 不是必须的 默认值-1(永不超时)
    表示事务超时的时间(以秒为单位)

    * read-only 不是必须的 默认值false不是只读的
    表示事务是否只读?

    * rollback-for 不是必须的
    表示将被触发进行回滚的 Exception(s);以逗号分开。
    如:'com.foo.MyBusinessException,ServletException'

    * no-rollback-for 不是必须的
    表示不被触发进行回滚的 Exception(s);以逗号分开。
    如:'com.foo.MyBusinessException,ServletException'


    任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
    -->
    <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
    <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
    <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
    <!-- 其他的方法之只读的 -->
    <tx:method name="*" read-only="true"/>
    </tx:attributes>
    </tx:advice>

    <!-- 5 配置切入点 -->
    <aop:config>

    <!-- 定义切入点,可以定义到类中所有的方法,之后在事务中在对方法进行细化 -->
    <aop:pointcut id="perform" expression="execution(* *.*(..))"/>

    <!-- 将通知和切入点关联起来-->
    <aop:advisor advice-ref="advice" pointcut-ref="perform"/>
    </aop:config>
    配置完事务管理器后,再常规的配置Bean注入对象.默认只有运行时异常才将导致事务回滚.
    基于注解配置事务管理器:
    XML配置文件中只需要声明事务管理器,而不需要给它"灵魂",因为"灵魂"是由注解注入,所以需要注解解析器的支持:
    <tx:annotation-driven transaction-manager="txManager"/>
    注册对事务注解进行解析的处理器,将注解与事务管理器关联起来即可.
    /**
    * 方法的事务设置将被优先执行。
    * 例如: BusinessService类在类的级别上被注解为只读事务,
    * 但是,这个类中的 save 方法的@Transactional 注解的事
    * 务设置将优先于类级别注解的事务设置。
    * 默认的 @Transactional 设置如下:
    * 事务传播设置是 PROPAGATION_REQUIRED
    * 事务隔离级别是 ISOLATION_DEFAULT
    * 事务是 读/写
    * 事务超时默认是依赖于事务系统的,或者事务超时没有被支持
    * 任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
    */
    @Transactional(readOnly=true)
    public class BusinessService {

    @Resource(name="personDao")
    private PersonDao personDao;

    @Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
    public void save() throws Exception{
    personDao.save();

    this.update();
    }

    public void update() throws Exception{
    personDao.save();

    personDao.update();
    }
    }


    小记:三大框架中最难的当属三大框架的整合,本文只是简单的将Spring的一些常见配置记下,诸如SpringMVC也不错,和StrutsMVC只是封装的不一样.Spring强大的声明式事务管理,常被用以业务层的封装.

  • 相关阅读:
    论文阅读笔记(四)【TIP2017】:Video-Based Pedestrian Re-Identification by Adaptive Spatio-Temporal Appearance Model
    论文阅读目录
    【学习】从.txt文件读取生成编译代码。
    页面显示其他电脑图片(局域网)
    控制台爬取小说(大王饶命)
    【自学】大话设计模式控制台
    将PDF转化为wrod
    【学习】爬糗事百科,可自动翻页。
    AHP(使用于某项目设备重要度评估测试)
    【学习】类重构、通用值交换、释放内存计算时间等
  • 原文地址:https://www.cnblogs.com/icenter/p/5279724.html
Copyright © 2020-2023  润新知