码迷,mamicode.com
首页 > 编程语言 > 详细

spring事务的配置使用

时间:2015-06-09 17:34:43      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:事务管理

第一种:编程式事务管理其中一种
配置文件中配置信息:

<bean id="txManagerForStatus"       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

事务使用的代码:

    @Autowired
    @Qualifier("sqlSession")
    private SqlSessionTemplate sqlSession;

    //
    @Autowired
    @Qualifier("txManagerForStatus")
    private DataSourceTransactionManager txManager;
@Override
    public int updateByPrimaryKey(JobMessage vo) {
        log.info("updateByPrimaryKey start,vo=" +vo);
        int exeStatus = 1;
        TransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus ts = this.txManager.getTransaction(td);
        try {
            exeStatus = sqlSession.update("jobMessage.updateByPrimaryKey", vo);
        } catch (Throwable t) {
            txManager.rollback(ts);
            log.error(t.getMessage());
        }
        txManager.commit(ts);

        String msUrl = PropertiesUtil.getPropertyValue("MS_URL");
        log.info("MS_URL=" + msUrl);
        MessageFormat myFormat=new MessageFormat( msUrl); 
        String url =myFormat.format(new String[]{String.valueOf(vo.getJobSeq()),vo.getTaskId()});
        HttpClientUtils.doGet(url);

        log.info("updateByPrimaryKey end ");
        return exeStatus;
    }

第二种:声明式事务
配置信息:

<bean id="sitdbTxManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="sitdb" />
    </bean>

    <tx:annotation-driven transaction-manager="sitdbTxManager"/>

还要在spring-servlet.xml中添加tx名字空间

<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:jms="http://www.springframework.org/schema/jms"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"

MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,否则事务管理会不起作用。
另外需要下载依赖包aopalliance.jar放置到WEB-INF/lib目录下。否则spring初始化时会报异常
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

@Transactional(readOnly = true)
public class DefaultFooService implements FooService {

  public Foo getFoo(String fooName) {
    // do something
  }

  // these settings have precedence for this method
  //方法上注解属性会覆盖类注解上的相同属性
  @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
  public void updateFoo(Foo foo) {
    // do something
  }
}

@Transactional属性

 
属性类型描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

用法

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

引用:http://www.cnblogs.com/xusir/p/3650522.html
两种的区别:
声明式的事务最小的粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。变通方法:可以将需要进行事务管理的代码块独立为方法等等

spring事务的配置使用

标签:事务管理

原文地址:http://blog.csdn.net/chendaoqiu/article/details/46426203

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!