spring 注解 事务,声明事务共存的情况下,先后顺序

最近在项目中,因为已配置全局声明式事务.不知道是否本来就配得有问题,导致一个多线程插入的方法会因为连接池不够用而导致失败.

就打算试试用注解式事务,然后发现不起作用,就想是不是嵌套事务的问题.然后找到这个哥们的文章,就解决了问题.这里转载一份

转载:http://blog.csdn.net/jeep_ouc/article/details/43056977

COME FROM

首先先看配置文件:

<!-- hibernate -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="connection.autoReconnect">true</prop>
                <prop key="connection.autoReconnectForPools">true</prop>
                <prop key="connection.is-connection-validation-required">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath*:*oddtech/bean</value>
            </list>
        </property>
    </bean>  

    <!-- 事務管理 -->
    <bean id="txManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 註解式事務的支持 -->
    <tx:annotation-driven transaction-manager="txManager"  order="0"/>
    <!-- 服務事務註冊切面 -->
    <aop:config >
        <aop:pointcut expression="execution(* oddtech.service.impl.*.*(..))"
            id="txPoint"  />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"  order="1"/>
    </aop:config>  

    <tx:advice transaction-manager="txManager" id="txAdvice">
        <tx:attributes >
            <tx:method name="find*" propagation="REQUIRED" read-only="true"
                rollback-for="Exception" />
            <tx:method name="select*" propagation="REQUIRED" read-only="true"
                rollback-for="Exception" />
            <tx:method name="insert*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="delete*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="update*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="modify*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="*" read-only="true"
                rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>  

当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,相当于在执行new Test().insert() 方法执行2次AOP切面。那么我们需要通过order 属性去定义AOP切面的先后执行顺序。 order越小,在AOP的chain 中越靠前,越先执行。(chain模式)

所以 我们需要在<tx:annotation-driven transaction-manager="txManager"  order="0"/>中加入order属性为0,<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"  order="1"/>加入order 属性为1.那么他们两个的执行顺序如下:

。这样就属于事务嵌套

那么我们再看上边说的例子:当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,那么我们想让insert 方法只读,read-only=true,那么我们需要这样去定义:@Transactional(readOnly = true,propagation=Propagation.REQUIRED),为什么呢?

在声明事务中,我们对insert 的事务传播级别定义为:REQUIRED,关于事务传播级别,请参照http://blog.csdn.net/feng27156/article/details/8534609,那么在注解事务中我们定义REQUIRED 的事务。声明事务在使用注解定义的事务级别。

除非在特殊的情况下,注解事务不要和声明事务有冲突。声明事务定义的是统一的规则,如果你想让某一个方法有特殊的事务传播机制的话,那么不要和统一的规则有冲突。

<tx:method name="*" read-only="true" rollback-for="Exception" />

按照規則,定義一個test方法,加入:@Transactional定義。则test 方法爲read-only=false,propagation=REQUIRED。這是默認的。統一規則<tx:method name="*" read-only="true" rollback-for="Exception" />不會對test方法的註解事務衝突。

时间: 2024-12-21 06:49:51

spring 注解 事务,声明事务共存的情况下,先后顺序的相关文章

Spring 注解方式实现 事务管理

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation

使用Spring注解方式管理事务与传播行为详解

使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional注解声明PersonServiceBean底下所有的业务方法需要事务管理,那么事务是如何来管理的呢? 我们知道当每个业务方法执行的时候,它都会打开事务,在业务方法执行结束之后,它就会结束事务.那么它什么时候决定这个事务提交,什么时候决定这个事务回滚呢?原先我们手工控制事务的时候,通常这个事务的提交或回滚是由我们来操纵的,那现在我们采用容器的声明式事务管理,那我们如何知道事务什么时候提交,什么时候回滚呢?答案是:Spr

Django框架,python2和python3共存的情况下,创建Django项目

一.python2和python3共存的情况下,直接使用 django-admin startproject Django-project 这个时候系统默认使用的是python2创建,可能由于python2未安装Django而报错. 在此可以使用绝对路径创建Django项目E:\Python3\Scripts\django-admin startproject guest 二.使用pycharm创建Django项目,填写好对应信息,就OK了 原文地址:https://www.cnblogs.co

spring 注解事务

前提:在applicationContext.xml中配置<tx:annotation-driven transaction-manager="transactionManager"/>表示支持注解事务 @Transactional只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能. Spring使用声明式事务处理,默认情况下(仅有@Transactional,括号中无配置),如果发生的异常是

Spring Boot中的事务管理

原文  http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合.由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退. 事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行

Spring中的Jdbc事务管理

Spring提供了对事务的声明式事务管理,只需要在配置文件中做一些配置,即可把操作纳入到事务管理当中,解除了和代码的耦合. Spring声明式事务管理,核心实现就是基于Aop. Spring声明式事务管理是粗粒度的事务控制,只能给整个方法应用事务,不可以对方法的某几行应用事务. Spring声明式事务管理器类: Jdbc技术:DataSourceTransactionManager Hibernate技术:HibernateTransactionManager 1.xml方式声明事务 引入tx名

spring+mybatis+Atomikos JTA事务配置说明

一.概览 Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品.产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransactions. TransactionEssentials的主要特征: JTA/XA 事务管理 -- 提供事务管理和连接池 不需要应用服务器 -- TransactionEssentials可以在任何Java EE应用服务器中运行,也就是不依赖于任何应用服务器 开源 -- TransactionE

0108 spring的申明式事务

背景 互联网的金融和电商行业,最关注数据库事务. 业务核心 说明 金融行业-金融产品金额 不允许发生错误 电商行业-商品交易金额,商品库存 不允许发生错误 面临的难点: 高并发下保证: 数据一致性,高性能: spring对事物的处理: 采用AOP技术提供事务支持,申明式事务,去除了代码中重复的try-catch-finally代码: 两个场景的解决方案: 场景 解决办法 库存扣减,交易记录,账户金额的数据一致性 数据库事务保证一致性 批量处理部分任务失败不影响批量任务的回滚 数据库事务传播行为

spring的声明式事务

事务的传播特性 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败.那么事务的传播特性也是从这里说起的.如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用