Spring事务和Activiti事务

一、Spring事务

 

1、事务传播行为种类(注解方式)   

参考文章:http://blog.csdn.net/nyistzp/article/details/9012275

    @Transactional(propagation=Propagation.REQUIRED)
    public Integer initOrderSeqProcess(OrderSeq orderSeq) {
        orderSeqMapper.insert(orderSeq);
        
        if (1 == 1){
        	throw new RuntimeException("test transaction");
        }
        
        Integer seqId = orderSeq.getId();
        return seqId;
    }

上面的代码不加上事务注解,尽管异常发生了,在orderSeq表中仍然会新增一条记录

上面的代码加上事务注解,异常发生了,orderSeq表中不会新增一条记录


2、当抛出异常类型为非RuntimeException,默认是不会滚的,除非显性的指定回滚时异常的类型才可以。如:

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
    public Integer testInsert() throws Exception {
    	OrderSeq orderSeq = new OrderSeq();
    	orderSeq.setSystemId(4);
    	orderSeq.setOrderId(100002);
    	orderSeq.setProductId(500001);
        orderSeqMapper.insert(orderSeq);
        
        if (1 == 1) {
        	throw new Exception("testTransaction");
//        	throw new RuntimeException("testTransaction");
        }
        return orderSeq.getId();
    }

3.在需要事务的类或方法上加@Transactional: 

   如果是类上加注解,该类的所有public方法都会应用事务 
   如果是方法上加注解,该方法会应用事务。 
   在接口上加注解有风险,如果使用CGLIB(类代理)将不会启用事务。 


4. 开启注解事务开关: 


5、基于JDK动态代理 ,可以将@Transactional放置在接口和具体类上。

基于CGLIB类代理,只能将@Transactional放置在具体类上。

可以参考文章

基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务

http://www.iteye.com/topic/1121357


6、关闭某方法的事务,方法可用如下注解修饰

@Transactional(propagation=Propagation.NOT_SUPPORTED) 


二、Activiti事务

前提:
事务配置采用spring注解@Transactional方式
activiti的serviceTask回调类A的execute方法中,调用的B类的某方法test()。

1、在A的execute方法中,无论是抛出RuntimeException,还是抛出Exception,
该节点的job都将卡住,不再继续执行流程。

2、针对Exception类型的异常,activiti本身会将其捕获,然后封装成一个RuntimeException(RuntimeException)异常再次抛出。

3、如果B的test()方法没有配置事务,当test()抛出了RuntimeException时,test()中提交的jdbc操作不会回滚。

4、如果B的test()方法配置了事务,当test()抛出了RuntimeException时,test()中提交的jdbc操作将回滚。

5、@Transactional注解无法修饰回调类A或A的任何方法上,否则activiti会报对象或者方法找不到的错。





你可能感兴趣的:(事务,spring,activiti)