简单使用
1.启动类上使用注解(springboot2 可以不使用)
@EnableTransactionManagement
2.server层实现类方法上使用注解(在类上使用代表全部方法使用注解(不建议使用))
//rollbackFor = Exception.class 代表报这错就回滚动 不加默认是RuntimeException异常回滚
@Transactional(rollbackFor = Exception.class)
@Override
public ResponseData update_password (String pwd, String originalPwd){
//数据库操作...
}
手动回滚(配合try-catch)
@Transactional(rollbackFor = Exception.class)
@Override
public ResponseData update_password (String pwd, String originalPwd){
//数据库操作...
try{
int i=1/0;
}catch(Exception e){
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
//也可以根据自己业务判断,手动回滚
手动回滚(回滚一部分,结点)
@Transactional(rollbackFor = Exception.class)
@Override
public ResponseData update_password (String pwd, String originalPwd){
//数据库操作1..
//设置回滚动的结点
Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//数据库操作2...
//手动回滚动到结点 只回滚数据库2操作,数据库1操作不回滚
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);
}
集成shiro权限框架
错误:org.springframework.transaction.NoTransactionException: No transaction aspec
这是spring无法创建事物管理器对象,被shiro权限框架抢了,在自定义Reamls中,我们会使用用户实现类去查密码,这样子这个用户实现类就不会被创建事物管理器了,
解决方法:
延迟加载就好了,在自定义Reamls中,给自动注入实现类加一个注解
@Lazy //延迟加载:使用到这个类时才注入
@Autowired
private UserInfoService userService;
@Transactional注解是可以带参数的
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组