@Data
public class UserInfo {
private int id;
private String username;
private String password;
private String photo;
private LocalDateTime createtime;
private LocalDateTime updatetime;
private int state;
}
java复制代码
@Mapper
public interface UserMapper {
@Insert("insert into userinfo(username,password) values (#{username},#{password})")
int add(UserInfo userInfo);
}
java复制代码
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public int add(UserInfo userInfo){
return userMapper.add(userInfo);
}
}
java复制代码
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/add")
@Transactional
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("huhu");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
System.out.println("result:" + result);
int num = 10/0;
// 3.将结果给前端
return result;
}
}
执行以上代码:结果如下,发生算数异常
但是sql执行没有异常:
这时候我们查看以下数据库有没有该数据,有没有进行数据回滚?
图中并没有我添加的数据,由此可见,@Transactional注解进行了数据回滚。
🎈注意:异常被捕获,不会发生事务回滚
问题:当自己把程序捕获以后,代表着事务不会发现程序发生了异常,在这种情况下,事务不会发生回滚。
java复制代码
@RequestMapping("/add")
@Transactional
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("huhu");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
System.out.println("result:" + result);
try{
int num = 10/0;
}catch (Exception e){
}
// 3.将结果给前端
return result;
}
解决方案1: 将异常继续抛出去(代理对象就能感知到异常,也能够回滚到事务)
java复制代码
@RequestMapping("/add")
@Transactional
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("万叶");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
System.out.println("result:" + result);
try{
int num = 10/0;
}catch (Exception e){
throw e;
}
// 3.将结果给前端
return result;
}
新增的信息不在里面:万叶的信息
解决方案2:使用代码手动回滚事务
java复制代码
@RequestMapping("/add")
@Transactional
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("万叶");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
System.out.println("result:" + result);
try{
int num = 10/0;
}catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
// 3.将结果给前端
return result;
}
@Transactional
public int add(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("add result -> "+result);
insert(userInfo);
return result;
}
@Transactional
public int insert(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("insert resullt -> "+ result);
int num = 10 / 0;
return result;
}
Controller:
java复制代码
@RequestMapping("/add")
@Transactional(propagation = Propagation.REQUIRED)
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("万叶");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
return result;
}
此时结果是,报错是算数异常,进行了事务回滚,数据库中没有添加任何数据
🎈 Propagation.SUPPORTS
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
示例:
UserService
java复制代码
@Transactional(propagation = Propagation.SUPPORTS)
public int add(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("add result -> "+result);
insert(userInfo);
return result;
}
@Transactional(propagation = Propagation.SUPPORTS)
public int insert(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("insert resullt -> "+ result);
int num = 10 / 0;
return result;
}
UserController:
java复制代码
@Transactional(propagation = Propagation.SUPPORTS)
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("万叶");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
return result;
}
当前调用链不存在事务,结果是数据库中添加了两条数据,并且报错是算数异常,但是并没有进行数据回滚
🎈 Propagation.NEVER
以非事务方式运行,如果当前存在事务,则抛出异常
UserController:
java复制代码
@RequestMapping("/add")
//调用链存在事务
@Transactional(propagation = Propagation.REQUIRED)
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("万叶");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
return result;
}
USerService:
java复制代码
@Transactional(propagation = Propagation.NEVER)
public int add(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("add result -> "+result);
insert(userInfo);
return result;
}
@Transactional(propagation = Propagation.NEVER)
public int insert(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("insert resullt -> "+ result);
int num = 10 / 0;
return result;
}
@Transactional(propagation = Propagation.NESTED)
public int add(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("add result -> "+result);
return result;
}
@Transactional(propagation = Propagation.NESTED)
public int insert(UserInfo userInfo){
int result = userMapper.add(userInfo);
System.out.println("insert resullt -> "+ result);
try{
int num = 10 / 0;
}catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
UserController:
java复制代码
@RequestMapping("/add")
@Transactional(propagation = Propagation.REQUIRED)
public int add(){
// 1.非空判断
UserInfo userInfo = new UserInfo();
userInfo.setUsername("影");
userInfo.setPassword("123");
// 2.调用service执行添加
int result = userService.add(userInfo);
userService.insert(userInfo);
return result;
}