spring中使用注解声明事务

释放双眼,带上耳机,听听看~!

在上一篇中我们已经简单的介绍了用xml的方式声明事务,spring中除了上述方式外,还可以直接使用注解的方式管理事务,也就是通过@Transactional注解对需要的事务进行事务管理的。@Transactional注解可以对类或者方法进行标注。下面我们使用测试用例来演示@Transactional注解的具体使用。

public interface IUserService {
    public void doInsert(UserInfo userInfo);
    public UserInfo getUserInfo(String id);
}
@Transactional // 添加事务注解
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserInfoDao userInfoDao;

    @Override
    public void doInsert(UserInfo userInfo) {
        userInfoDao.doInsert(userInfo);
    }

    @Override
    public UserInfo getUserInfo(String id) {
        return userInfoDao.findById(id);
    }
}

因为@Transactional注解有默认的事务属性,所以只需要添加上述注解即可完成对事务的管理。但有一个问题我们要注意,就是虽然上述注解有默认事务功能,但是我们知道,事务的注解底层是通过AOP的方式实现事务管理的,所以我们还需要的配置spring中的xml,使之让spring支持对@Transactional注解的支持。具体配置如下:

<!-- 配置基于注解的声明式事务默认使用注解来管理事务行为 --><tx:annotation-driven transaction-manager="transactionManager"/> 

上述配置是最简单的配置,实际上<tx:annotation-driven>标签还有别外两个属性,下面我们看一下这两个属性的具体功能。

proxy-target-class--:如果为true,则spring将创建子类来代理事务类,如果为false,则使用接口代理。如果使用子类代理,则项目中必须添加CGLib.jar库。
order--:如果业务类除了事务切面外,还要织入其它的切面,则可以通过该属性控制事务切面在目标连接点的织入顺序。

下面我们看一下@Transactional注解的相关默认属性都有哪些。

  • 事务传播行为--:PROPAGATION_REQUIRED
  • 事务隔离级别--:ISOLATION_DEFAULT
  • 读写事务属性--:读/写事务
  • 超时时间--:依赖底层的事务属性默认值
  • 回滚设置--:运行期异常回滚

上述介绍的是@Transactional注解的默认设置,虽然很常用,但不一定能满足我们所有的需求,所以,spring还提供我们手动设置上述默认注解的功能。具体的配置如下:

下面我们介绍一下@Transactional注解的注意事项

  • @Transactional注解可以被应用于接口定义接口方法、类定义、和类的public方法上。但spring建议我们将@Transactional注解最好标注在业务类的上。这是因为注解不能被继承,所以,如果我们将@Transactional注解标注在接口上时,那么它的子类由于无法继承,所以,此时的子类,spring是不会进行事务管理的。
  • 如果一个类已经使用了@Transactional注解,这时spring就会将这个类中所有的public方法上都添加事务管理,如果我们此时又在public方法上添加的方法级别的@Transactional注解,那么spring默认会用方法的注解覆盖类上面的@Transactional注解。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧