@Transactional事务锁

一、介绍

    @Transactional是建立在AOP基础上的,它的本质是对方法的前后进行拦截,在目标方法开始前创建一个事务,在目标方法运行结束时根据运行的情况进行提交或者回滚操作。使用@Transactional不会对代码造成污染,使用起来简单便捷。

二、相关的配置

  • readOnly:该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true);
  • rollbackFor: 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class});
  • rollbackForClassName: 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})。
  • noRollbackFor:该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})。
  • noRollbackForClassName:该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})。
  • propagation : 该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)。
  • isolation:该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置。
  • timeout:该属性用于设置事务的超时秒数,默认值为-1表示永不超时。

三、注意事项

  • 事务@Transactional的使用必须要放在类的公共public方法中,如果将事务放在protected、private方法上时,他不会报错,但事务无效。
  • 一个未加@Transactional的父方法A在调用加了@Transactional的子方法B时,若在A中抛出异常,那么事务不会回滚;反之,一个加了@Transactional的父方法A在调用未加@Transactional的子方法B时,若在A中抛出异常,事务仍然生效。
  • 事务的回滚必须有异常抛出,如果加了@Transactional的方法在捕获了异常却自己处理了该异常,那么事务不会进行回滚
 
    
 

猜你喜欢

转载自www.cnblogs.com/sxhjoker/p/11416177.html
今日推荐