文档章节

Spring @Transactional的简单配置总结

hebad
 hebad
发布于 2014/09/14 23:37
字数 1014
阅读 488
收藏 1
  • 背景:

    1. spring老版本是使用TransactionProxyFactoryBean来实现对spring的事务进行配置(缺点自己google,一大堆的缺点)

    2. spring2.x引入了AOP(面向切面的编程)

    3. 当初项目也是喜欢用spring xml方式的配置,后来项目使用spring3.x版本,看到了@Transactional注解,个人觉得挺方便和实用。(具体什么原因,说不清)

  • 上代码

    1. <?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-3.2.xsd
      		     http://www.springframework.org/schema/context
      		     http://www.springframework.org/schema/context/spring-context-3.2.xsd
      		     http://www.springframework.org/schema/tx
      		     http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
      		     http://www.springframework.org/schema/aop 
      		     http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
      
      
          <!-- ################# start ################ -->
      
          <context:component-scan base-package="com.xun.spring3.src"></context:component-scan>
      
          <bean id="placeholderConfig"
                class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
              <property name="location">
                  <value>classpath:/db.properties</value>
              </property>
          </bean>
      
          <!-- ################### end ############## -->
      
      	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
      		<property name="dataSource" ref="dataSource"></property>
      		<property name="configLocation">
      			<value>classpath:/sqlmap-config.xml</value>
      		</property>
      		<property name="mappingLocations">
      			<value>classpath*:/sqlmap/*.xml</value>
      		</property>
      	</bean>
      
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
                init-method="init" destroy-method="close">
              <property name="url" value="${jdbc.url}" />
              <property name="username" value="${jdbc.user}"></property>
              <property name="password" value="${jdbc.password}" />
      
              <property name="filters"><value>stat</value></property>
      
              <property name="maxActive"><value>20</value></property>
              <property name="initialSize"><value>1</value></property>
              <property name="maxWait"><value>60000</value></property>
              <property name="minIdle"><value>1</value></property>
      
              <property name="timeBetweenEvictionRunsMillis"><value>60000</value></property>
              <property name="minEvictableIdleTimeMillis"><value>300000</value></property>
      
              <property name="validationQuery"><value>SELECT 'x'</value></property>
              <property name="testWhileIdle"><value>true</value></property>
              <property name="testOnBorrow"><value>false</value></property>
              <property name="testOnReturn"><value>false</value></property>
      
              <property name="poolPreparedStatements"><value>true</value></property>
              <property name="maxOpenPreparedStatements"><value>20</value></property>
          </bean>
      
          <!--
              其实 不涉及到分布式事务的话,无需定义这个模板 sqlMapClient,因为basedao已经SqlMapClientDaoSupport这个类,
              SqlMapClientDaoSupport中已经有SqlMapClientTemplate这个属性了。
          -->
          <!--
          <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
              <property name="sqlMapClient" ref="sqlMapClient"></property>
          </bean>
          -->
      
      	<!-- transaction confige -->
          <!--
              作用:开启对@Transactional注解的加工处理,以织入事务管理切面
              <tx:annotation-driven>属性说明:
              (1):属性transaction-manager:指定事务管理器名字,默认为transactionManager,当使用其他名字时需要明确指定
              (2):proxy-target-class: 如果为true,Spring将通过创建子类来代理业务类;
                                      如果为false(默认),则使用基于接口来代理。
                                      (ps:如果使用子类代理,需要在类路径中添加CGLib.jar类库)
              (3):order:如果业务类除事务切面外,还需要织入其它的切面(或者多个事务切面),通过该属性来控制切面在目标连接点的织入顺序
          -->
      	<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />
      
          <!--proxy-target-class:默认false表示使用JDK代理,如果为true将使用CGLIB代理-->
          <!-- 使用CGLIB的话需要加上aspectjrt和aspectjweaver 的jar-->
          <aop:aspectj-autoproxy proxy-target-class="true" />
      
          <!-- 对于cobar对数据源的时候我们用这个 -->
          <!--<bean id="txManager" class="com.alibaba.cobar.client.transaction.MultipleDataSourcesTransactionManager">
      		<property name="cobarDataSourceService" ref="dataSources" />
          </bean>-->
          <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
              <property name="dataSource" ref="dataSource"></property>
          </bean>
      
      </beans>
    2. package com.xun.spring3.src.dao;
      
      import com.ibatis.sqlmap.client.SqlMapClient;
      import org.apache.commons.lang.StringUtils;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
      
      import javax.annotation.PostConstruct;
      import java.lang.reflect.ParameterizedType;
      import java.lang.reflect.Type;
      
      /**
       * 要求每个dao的命名以 Dao结尾
       * 泛型 ENTITY - 具体哪个实体
       * 泛型 PRIMARYKEY - 具体主键的类型
       * @Date : 2014/9/7 0007 20:41
       * @From : spring3-test
       * @Author : hebad90@163.com
       */
      public class BaseDao<ENTITY, PRIMARYKEY> extends SqlMapClientDaoSupport {
      
          @Autowired
          private SqlMapClient sqlMapClient;
      
          @PostConstruct
          private void initSuper() {
              /**
               * 初始化父类
               */
              super.setSqlMapClient( sqlMapClient );
          }
      
          private Class entityClass ;
      
          private String ibatisNamespace;
      
          protected BaseDao() {
              Type genType = getClass().getGenericSuperclass();
              Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
              entityClass = (Class)params[0];
      
              /**
               * 获取当前 ibatis的命名空间 XxxDao 即命名空间为 xxx
               */
              this.ibatisNamespace = getIbatisNamespace( getClass() );
      
              System.out.println( "初始化当前环境成功,ibatisNamespace=["+this.ibatisNamespace+"],entityClass=[" + entityClass + "]" );
      
          }
      
          public PRIMARYKEY insert( ENTITY entity ) {
              return(PRIMARYKEY)super.getSqlMapClientTemplate().insert( this.ibatisNamespace + ".insert", entity );
          }
      
          public int update( ENTITY entity ) {
              return super.getSqlMapClientTemplate().update( this.ibatisNamespace + ".update", entity );
          }
      
          public ENTITY queryById( PRIMARYKEY primarykey ) {
              return ( ENTITY ) super.getSqlMapClientTemplate().queryForObject( this.ibatisNamespace + ".queryById", primarykey);
          }
      
          public int delete( ENTITY entity ) {
              return super.getSqlMapClientTemplate().delete( this.ibatisNamespace + ".delete", entity);
          }
      
      
          ///##############################
          private String getIbatisNamespace( Class clazz ) {
              String simpleName = clazz.getSimpleName();
              int index = StringUtils.indexOf( simpleName, "Dao" );
      
              return StringUtils.lowerCase( StringUtils.substring( simpleName, 0, index ) );
          }
      
      }
    3. @Transactional在何处使用?Spring建议我们在业务实现类上使用该注解,因为java的实现不能继承注解。所以,最好是在业务实现类上注解,这样不管<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />中的proxy-target-class为true或者false,业务类都会启用事务机制。

    4. @Transactional的参数怎么使用?


    结束:暂时写这么多,大家可以参考参考。


© 著作权归作者所有

hebad
粉丝 16
博文 100
码字总数 11190
作品 0
杭州
技术主管
私信 提问
Spring 声明式注解事务实现机制

Spring中注解事务实现机制 在使用@Transactional 注解管理事务时步骤很简单。但是如果对@Transactional理解不够透彻,很容易出现事务不起作用的情况。所以,在对@Transactional的实现机制要有...

狂奔的熊二
2018/09/21
185
0
Spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

一、注解式事务 1、注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo。 2、事务配置实例 (1)、spring+mybatis 事务配置 (2)、...

哲别0
2018/04/20
140
0
Spring事务--声明式事务和编程式事务

声明式事务和编程式事务 声明式事务是基于代理实现的。最小的力度是方法级。编程式事务是基于事务模版来做的,具有较高的侵略性,不建议使用。 编程式事务管理 基于底层 API 的编程式事务管理...

细节探索者
09/10
53
0
关于Spring事务的理解

在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx、mvc 等也能很直白的理解出来分别的作用。 就是支持事务注解的(@Tran...

细节探索者
09/11
61
0
Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getCon...

rockypeng
2014/01/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀系统思路

业务分析 技术挑战 请求响应要快:无论成功失败,需要尽快返回给用户 架构设计   前端:静态化   站点层:限制请求数   服务层:乐观锁写缓存   数据库CAP:读写高可用,一致性,扩容...

雷开你的门
19分钟前
7
0
最全的教育行业大数据解决方案,个个针对痛点

大数据的悄然兴起也带动了教育行业的革新,移动教育、云课堂等的出现,使得教育行业再次成为了可以中长期保持高景气的行业。然而,初涉数据领域的教育行业同时也面临着相当大的难题,还需要更...

朕想上头条
23分钟前
5
0
预约模块设计分析

1.预约功能描述: 预约是小程序中常见的一种商品管理系统,商家可根据商品或服务的特性,灵活设置预约细节,为用户提供线上预约服务,如场地预约,商品预定等,实现高效经营。 预约场景: ...

鱼煎
27分钟前
4
0
阿里云日志服务构建网站实时分析大盘实战

场景分析 挖掘数据价值是当前企业级网站共同面临的问题。买买网是一个电商平台网站,每天拥有大量的用户访问和购买记录。为了引导用户直接消费,提升购买率和转化率,不同的用户类别需要推荐...

阿里云官方博客
28分钟前
2
0
TL665xF-EasyEVM开发板硬件处理器、NAND FLASH、RAM

广州创龙结合TI KeyStone系列多核架构TMS320C665x及Xilinx Artix-7系列FPGA设计的TL665xF-EasyEVM开发板是一款DSP+FPGA高速大数据采集处理平台,其底板采用沉金无铅工艺的6层板设计,适用于高...

Tronlong创龙
31分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部