一、Spring事务
参考文章:http://blog.youkuaiyun.com/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. 开启注解事务开关:<tx:annotation-driven />
5、基于JDK动态代理 ,可以将@Transactional放置在接口和具体类上。
基于CGLIB类代理,只能将@Transactional放置在具体类上。
可以参考文章
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务
http://www.iteye.com/topic/1121357
6、关闭某方法的事务,方法可用如下注解修饰
@Transactional(propagation=Propagation.NOT_SUPPORTED)
5、@Transactional注解无法修饰回调类A或A的任何方法上,否则activiti会报对象或者方法找不到的错。