代码世界聚眸光,昼夜敲盘思绪长。
算法心间精构建,编程路上细思量。
屏前架构乾坤定,键上飞驰智慧扬。
默默耕耘成果现,创新科技铸辉煌。
目录
一,概念
二,Spring事务管理
下面我们举一个小例子来演示一下
首先创建一个Service的接口:
java
public interface IYZService {
/**
* 处理用户信息
* */
User dealUser(String name);
/**
* 测试
* */
User testUser(String name);
}
然后实现Service接口:
java
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZService implements IYZService {
@Autowired //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 这就是依赖注入
private YZDao yzDao;
@Override
public User dealUser(String name) {
User user = yzDao.findUserByName(name);
Address address = new Address();
address.setCity("淄博");
address.setProvince("山东");
user.setAddress(address);
return user;
}
@Override
public User testUser(String name) {
User user = yzDao.findUserByName(name);
Address address = new Address();
address.setCity("淄博1");
address.setProvince("山东1");
user.setAddress(address);
return user;
}
}
Dao的接口和类:
java
public interface IYZDao {
/*
* 根据用户姓名查找用户信息
* **/
User findUserByName(String name);
}
java
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZDao implements IYZDao {
@Override
public User findUserByName(String name) {
User user = new User();
user.setName(name);
user.setAge(20);
Address address = new Address();
address.setProvince("北京");
address.setCity("北京");
user.setAddress(address);
return user ;
}
}
Controller层代码:
java
@RestController
public class RequestController {
@Resource(name ="YZService")
private IYZService yzService;
@RequestMapping("/yzTestPath/{name}")
public Result yzTestPath(@PathVariable String name){
User user = yzService.dealUser(name);
User user2 = yzService.testUser(name);
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user2);
return Result.success(list);
}
}
测试:
下面我们先定义一个全局的异常处理器:GlobalExceptionHandler
java
/**
* 全局异常管理器
* */
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result exception(Exception e) {
e.printStackTrace();
return Result.error("对不起,操作失败,请联系管理员");
}
}
接下来我们模拟一个异常
java
@RestController
public class RequestController {
@Resource(name ="YZService")
private IYZService yzService;
@RequestMapping("/yzTestPath/{name}")
public Result yzTestPath(@PathVariable String name){
User user = yzService.dealUser(name);
//抛出异常
int i =1/0;
User user2 = yzService.testUser(name);
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user2);
return Result.success(list);
}
}
接着我们请求接口:
然后看控制台:
错误的堆栈信息也打印出来了。
接下来我们继续将事务管理,这里需要用到@Transactional这个注解:
这个注解一般是作用在业务层的曾删改这一层上面的
三,rollbackFor事务回滚
那么我们如果要指定在所有异常情况下都回滚呢?
java
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZDao implements IYZDao {
@Transactional(rollbackFor = Exception.class)
@Override
public User findUserByName(String name) {
User user = 数据库操作
return user ;
}
}
四,propagation传播行为
常见的传播行为
java
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZDao implements IYZDao {
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@Override
public User findUserByName(String name) {
User user = new User();
user.setName(name);
user.setAge(20);
Address address = new Address();
address.setProvince("北京");
address.setCity("北京");
user.setAddress(address);
test();
return user ;
}
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
public void test(){
}
}