- for update 查询字段需要时索引列 才是行锁,否则变成表锁(悲观锁)
springAOP
@transactional
需要ioc容器 中的代理类调用才会生效,因为容器中的实例,实现aop中的额外代码。
自定义aop中
1 @pointcut 切点 配合@before @after
@Aspect//切面注解
@Component//构成
public class LoginAspect
{
//设置在ManagerController的login方法的切点
@Pointcut("execution(public * com.jieshao.evm.Controller.ManagerController.login(..))")
public void login(){//切点映射,命名不规定
System.out.println("aspect");
}
//在本类的login执行之前
@Before("login()")
public void beforelogin()
{
System.out.println("before");
}
//在本类的login执行之后执行
@After("login()")
public void afterlogin(){System.out.println("after");}
}
@around 上面加一起
@Aspect
@Component
public class LoginAspect
{
/**
* 策略一,在所有的自定义注解NeedManagetPower方法上打断点
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("@annotation(NeedManagerPower)))")
/**
* 策略二,将整个ManagerController除了Public String login()方法全打上切面
* @param joinPoint
* @return
* @throws Throwable
*/
//@Around("within(com.jieshao.evm.Controller.ManagerController)&&!execution(public String com.jieshao.evm.Controller.ManagerController.login(..))")
public String checklogin(ProceedingJoinPoint joinPoint) throws Throwable {
HttpSession session= ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
if (session.getAttribute("username")!=null){
if(session.getAttribute("power").equals(KeyWord.MANAGER_ROOT)) {
//通过登录和权限检测
//正常运行
return (String)joinPoint.proceed();
}else{
return "{\"errno\":\"-2\",\"errmsg\":\"管理员权限不足\"}";
}
}else{
return "{\"errno\":\"-1\",\"errmsg\":\"管理员未登录\"}";
}
}
}
当然切面注释也可以添加 参数