spring事务的配置使用

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

<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属性

 
属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

用法

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值