zoukankan      html  css  js  c++  java
  • spring的两种事务

    1、事务

    spring支持编程式事务管理和声明式事务管理两种方式。
    编程式事务使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

    声明式事务是建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。


    声明式事务的配置

    DataSourceTransactionManager是事务管理器的类型,
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.
    DataSourceTransactionManager">
    <!-- 注入数据源 -->
    <property name="dataSource" ref="dataSource"/>
    </bean>

    事务管理器的配置
    <tx:advice id="txAdvice" transaction-manager="transactionManager"></tx:advice>
    transaction-manager :需要依赖的事务管理器
    id : 事务配置的唯一标识


    <!-- 配置AOP把上面的事务配置切入到Service层 -->

    <aop:config>
    </aop:config>
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.
    DataSourceTransactionManager">
    <!-- 注入数据源 -->
    <property name="dataSource" ref="dataSource"/>
    </bean>


    <!-- 事务的配置
    <tx:advice transaction-manager="transactionManager"></tx:advice>
    transaction-manager :需要依赖的事务管理器
    id : 事务配置的唯一标识
    -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!-- 事务的属性配置 -->
    <tx:attributes>

    <!--
    <tx:method name=""/>
    需要被事务管理的方法 ,一般是都是service层的方法
    name : 被事务管理的方法名
    isolation :事务的隔离级别(REPEATABLE_READ)
    propagation : 事务的传播规则 (REQUIRED)
    read-only :是否是只读事务,默认false(DML 非只读事务,DQL
    :只读事务-效率相对高一些)
    timeout:配置事务超时时间

    -->

    <!-- <tx:method name="trans" isolation="REPEATABLE_READ"
    propagation="REQUIRED" read-only="false"/> -->

    <!-- 事务方法配置细节
    在实际开发中service的方法必须遵循一定编写规则
    DQL最好指定 前缀规则 : selectXxx,queryXxx, findXxx,getXxx
    我们可以使用 * 来配置指定规则的所有方法

    DQL 一般配 只读事务
    read-only="true"
    DML 一般配 非只读事务
    read-only="false"
    -->
    <!-- DQL 方法 -->
    <tx:method name="select*" read-only="true" isolation="REPEATABLE_READ"
    propagation="REQUIRED" />
    <tx:method name="find*" read-only="true" isolation="REPEATABLE_READ"
    propagation="REQUIRED" />
    <tx:method name="get*" read-only="true" isolation="REPEATABLE_READ"
    propagation="REQUIRED" />
    <tx:method name="query*" read-only="true" isolation="REPEATABLE_READ"
    propagation="REQUIRED" />

    <!-- DML 方法 * 号一定要在最后配置 -->
    <tx:method name="*" read-only="false" isolation="REPEATABLE_READ"
    propagation="REQUIRED" />

    </tx:attributes>
    </tx:advice>

    <!-- 配置AOP把上面的事务配置切入到Service层 -->
    <aop:config>
    <!-- 配置切入点 -->
    <aop:pointcut expression="execution(* cn.zj.spring.service..*.*(..))" id="pt"/>
    <!-- 配置事务切面: 切入点加通知
    事务默认使用的环绕通知
    <aop:aspect></aop:aspect> :开发者自定功能进行aop配置事务

    AOP对象事务管理配置的标签
    <aop:advisor advice-ref=""/>
    advice-ref :事务配置的 id
    pointcut-ref :切入点引用
    -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

    <!-- Weaving : 织入,spring处理 -->
    </aop:config>


    编程式事务

  • 相关阅读:
    JavaScript 获得今天的日期 (yy-mm-dd)格式
    web前端筛选页面(类似大众点评)
    JS 获取浏览器的名称和版本信息
    java 接收json数据
    指定配置文件启动mongodb
    linux写一个定时任务
    windows杀死占用端口
    mongodb聚合操作汇总
    jpa常用查询
    idea 更换主题
  • 原文地址:https://www.cnblogs.com/dxwen/p/11228205.html
Copyright © 2011-2022 走看看