spring(事务管理,AOP)

事务管理

事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。

spring(事务管理,AOP)_第1张图片

 案例:解散部门:删除部门,同时删除该部门下的员工,无论成功失败,都记录操作日志到数据库表

注解:@Transactional

位置:业务(service)层的方法上、类上 、接口上

作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务 

默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

属性值

含义

REQUIRED

【默认值】需要事务,有则加入,无则创建新事务

REQUIRES_NEW

需要新事务,无论有无,总是创建新事务

REQUIRED :大部分情况下都是用该传播行为即可。

REQUIRES_NEW :当我们不希望事务之间相互影响时,可以使用该传播行为。

比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

yml中:

logging:

    level:

       org.springframework.jdbc.support.JdbcTransactionManager: debug

1.EmpMapper中:

/**
     * 根据部门ID删除该部门下的员工数据
     * @param deptId
     */
    @Delete("delete  from emp where dept_id = #{deptId}")
    void deleteByDeptId(Integer deptId);

2.DeptServicelmpl.java下

@Autowired
    private DeptMapper deptMapper;
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private DeptLogService deptLogService;

    @Override
    public List list() {
        return deptMapper.list();
    }

    //@Transactional(rollbackFor = Exception.class) //spring事务管理
    @Transactional
    @Override
    public void delete(Integer id) throws Exception {
        try {
            deptMapper.deleteById(id); //根据ID删除部门数据

            int i = 1/0;
            //if(true){throw new Exception("出错啦...");}

            empMapper.deleteByDeptId(id); //根据部门ID删除该部门下的员工
        } finally {
            DeptLog deptLog = new DeptLog();
            deptLog.setCreateTime(LocalDateTime.now());
            deptLog.setDescription("执行了解散部门的操作,此次解散的是"+id+"号部门");
            deptLogService.insert(deptLog);
        }
    }

 

 DeptLogService接口:

 void insert(DeptLog deptLog);

DeptLog Servicelmpl:

@Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void insert(DeptLog deptLog) {
        deptLogMapper.insert(deptLog);
    }

AOP基础

面向切面编程、面向方面编程,其实就是面向特定方法编程。

场景:案例部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每一个业务方法的执行耗时

实现:动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。

案例:统计各个业务层方法执行耗时

1.导入依赖:在pom.xml中导入AOP的依赖

   

     org.springframework.boot    

     spring-boot-starter-aop

2.编写AOP程序:针对于特定方法根据业务需要进行编程

aop.TimeAspect:

@Slf4j
@Component
@Aspect //AOP类
public class TimeAspect {

    @Around("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))") //切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //1. 记录开始时间
        long begin = System.currentTimeMillis();

        //2. 调用原始方法运行
        Object result = joinPoint.proceed();

        //3. 记录结束时间, 计算方法执行耗时
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature()+"方法执行耗时: {}ms", end-begin);

        return result;
    }

}

AOP进阶

AOP案例

你可能感兴趣的:(spring,java,后端)