前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring的事物配置 原

spring的事物配置 原

作者头像
尚浩宇
发布2018-08-17 09:55:42
4610
发布2018-08-17 09:55:42
举报
文章被收录于专栏:杂烩

     概念说完了,下面是说说怎么实际操作。

    首先是spring配置文件:   

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  
    <bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">  
        <property name="driverClassName"  
            value="org.gjt.mm.mysql.Driver" />  
        <property name="url"  
            value="jdbc:mysql://localhost:3306/test?userUnicode=true&amp;characterEncoding=UTF-8" />  
        <property name="username" value="root" />  
        <property name="password" value="5" />  
        <!-- 连接池启动时的初始值 -->  
        <property name="initialSize" value="1" />  
        <!-- 连接池的最大值 -->  
        <property name="maxActive" value="500" />  
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
        <property name="maxIdle" value="2" />  
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
        <property name="minIdle" value="1" />  
    </bean>  
  
  
    <!-- 1.注解方式配置事务  -->  
    <bean id="txManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
  
    <tx:annotation-driven transaction-manager="txManager" />  
  
  
  
    <!-- 2.xml方式配置事务.利用aop技术   
        <aop:config>  
        <aop:pointcut id="transactionPointcut" expression="execution(* com.test.service..*.*(..))"/>  
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>  
        </aop:config>   
        <tx:advice id="txAdvice" transaction-manager="txManager">  
        <tx:attributes>  
        <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>  
        <tx:method name="*"/>  
        </tx:attributes>  
        </tx:advice>  
    -->  
    <bean id="personService"  
        class="com.test.service.impl.PersonServiceImpl">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>  
</beans>

    xml配置这里不细说了,这里主要讲的是注解方式。     需要注意的是:        @Transactional只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.     Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。这种默认的行为是可以改变的。 使用@Transactional注解的noRollbackFor和rollbackFor属性。 如:@Transactional(rollbackFor=Exception.class)可以使checked异常发生时,数据库操作也rollback、@Transactional(noRollbackFor=RuntimeException.class)可以使unchecked异常发生时也提交数据库操作。也可以使用noRollbackForClassName、rollbackForClassName属性来指定一个异常类名的String数组来改变默认的行为。 另外此注解要是只在接口上写, 接口的实现类就会继承下来、接口的实现类的具体方法,可以覆盖类声明处的设置  。     @Transactional  的所有可选属性如下:  

属性

类型

默认值

说明

propagation

Propagation枚举

REQUIRED

事务传播属性

isolation

isolation枚举

DEFAULT

事务隔离级别

readOnly

boolean

false

是否只读

timeout

int

-1

超时(秒)

rollbackFor

Class[]  {}

需要回滚的异常类

rollbackForClassName

String[]  {}

需要回滚的异常类名

noRollbackFor

Class[]  {}

不需要回滚的异常类

noRollbackForClassName

String[]  {}

不需要回滚的异常类名

    Java代码

代码语言:javascript
复制
@Transactional
public class TestServiceBean implements TestService {   
    private TestDao dao;   
    public void setDao(TestDao dao) {        
        this.dao = dao;
    }   
    @Transactional(propagation = Propagation.NOT_SUPPORTED)    
    public List<Object> getAll() {        
        return null;
    }   
}

    spring团队对这个注解的说明是:

    Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/06/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档