一、mybatis.xml配置:
${driver.mysql}
${url.mysql}
注:如果有其他数据连接池使用DataSourceTrasactionManager来处理事务,则事务处理不会成功(如下图)。因此,这种方式只能一个数据连接池使用。(不知道怎么回事,如果有知道的请给我留个言,不胜感激。)
jdbc.xml:同一个项目同时存在两个事务管理,且都是引用DataSourceTransactionManager,则事务管理不会成功。可注释其中一个事务管理。
....
....
mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理。
proxy-target-class:如果为true,Spring将创建子类来代理业务类;如果为false,则使用基于接口的代理。(如果使用子类代理,需要在类路径中添加CGLib.jar类库)。
order:如果业务类除事务切面外,还需要织入其他的切面,通过该属性可以控制事务切面在目标连接点的织入顺序。
transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用。
二、DAO/Mapper:略。(我们的事务管理放在service接口处)三、事务管理的接口类及方法:
接口类:
public interface IQuestionService {
@Transactional(rollbackFor = Exception.class,isolation=Isolation.SERIALIZABLE)
public abstract void saveOrUpdate() throws Exception;
}
说明:1、rollbackFor:回滚条件;2、isolation:事务隔离级别;3、SERIALIZABLE:禁止脏读、不可重复读和幻读。
实现类:
@Service("questionService")
public class QuestionServiceImpl implements IQuestionService {
@Override
public void saveOrUpdate() throws Exception{
//执行第一个sql,代码略
boolean result1=true;
if(!result1){
//抛出异常,则将不再执行第二个sql
throw new Exception("操作失败!");
}
//执行第二个sql,代码略
boolean result2=true;
if(!result2){
//抛出异常,则第一个sql将回滚
throw new Exception("操作失败!");
}
}
}
*************以下内容转自http://my.oschina.net/guanzhenxing/blog/214228***********
四、@Transactional的属性
属性名 |
类型 |
说明 |
isolation |
枚举org.springframework.transaction.annotation.Isolation的值 |
事务隔离级别 |
noRollbackFor |
Class[] |
一组异常类,遇到时不回滚。默认为{} |
noRollbackForClassName |
Stirng[] |
一组异常类名,遇到时不回滚,默认为{} |
propagation |
枚举org.springframework.transaction.annotation.Propagation的值 |
事务传播行为 |
readOnly |
boolean |
事务读写性 |
rollbackFor |
Class[] |
一组异常类,遇到时回滚 |
rollbackForClassName |
Stirng[] |
一组异常类名,遇到时回滚 |
timeout |
int |
超时时间,以秒为单位 |
value |
String |
可选的限定描述符,指定使用的事务管理器 |
五、@Transactional标注的位置:
1、@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。
2、如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承。所以可能会出现不启动事务的情况。所以,Spring建议我们将@Transaction注解在实现类上。
3、在方法上的@Transactional注解会覆盖掉类上的@Transactional。