1、事务使用
在代码中使用事务很简单,只需要在方法上添加好@Transactional注解即可
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 服务实现类
* </p>
* @author 小吾
* @since 2020-05-21
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
/**
* 在方法上加上@Transactional注解,即可
*/
@Transactional(rollbackFor = Exception.class)
public String transactionNo1() {
User user = new User();
user.setName("小吾1号");
user.setSex(1);
userMapper.insert(user);
System.out.println("没有异常事务不会触发,生成数据");
return "新增成功,没有异常";
}
@Transactional(rollbackFor = Exception.class)
public String transactionNo2() {
User user = new User();
user.setName("小吾2号");
user.setSex(1);
userMapper.insert(user);
//这里我们给他出现一个异常使事务进行回滚
int x = 2 / 0;
//如果我们这里想要抛出自己的异常,可以使用try{}catch (){}抛出自定义异常信息
System.out.println("这一段输出,就不会输出,直接执行事务回滚操作");
return "新增失败,异常捕获,事务回滚";
}
}
2、@Transactional简单介绍+使用方式
- @Transactional注解使用在接口实现类或者接口实现方法上,不能实现在接口类中
- @Transactional注解方法不能被
其他方法间接
调用,否则事务会失效
/** 我们通过非事务方法调用事务方法,这时会导致事务失效 */
public String transactionNo3() {
return transactionalNo3();
}
/** 这里触发异常,小吾3号会直接新增,不会进行回滚 */
@Transactional(rollbackFor = Exception.class)
public String transactionalNo3(){
User user = new User();
user.setName("小吾3号");
user.setSex(1);
userMapper.insert(user);
int x = 2 / 0;
return "新增失败,异常捕获,事务回滚";
}
- @Transactional注解只能使用在public方法上面,否则事务会失效。例:作用在private方法
/**
* 我们在控制层方法上使用private这时我们会发现事务失效,数据新增成功
*/
@GetMapping("/transactionNo4")
@Transactional(rollbackFor = Exception.class)
private String transactionNo4(){
System.out.println("测试事务是否回滚成功,方法4-非public方法使用事务");
User user = new User();
user.setName("小吾4号");
user.setSex(1);
userMapper.insert(user);
//备注,我在控制层使用mapper接口是相当不符合代码规范的,这里只用于测试,勿怪
int x = 2 / 0;
return "方法4";
}
- @Transactional注解对方法内线程方法无法作用到,线程出现异常也无法导致事务回滚
@Transactional(rollbackFor = Exception.class)
public String transactionNo5() {
User user = new User();
user.setName("小吾5号");
user.setSex(1);
userMapper.insert(user);
Timer timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
System.out.println("hello");
//线程内部出现异常,并不会导致事务回滚
int x = 2/0;
}
},2000,4000
);
//同时线程外部异常也不会导致线程停止,但会使事务回滚
int x = 2 / 0;
return "事务与线程";
}
@Transactional注解 rollbackFor默认是捕获(RuntimeException)运行时异常
类以及其子类的,当方法抛出(checked exception)编译时异常
是不会进行捕获的,例如:IOException;需要捕获这类异常我们就要修改rollbackFor的作用范围。
关于事务的介绍还有很多的不足,这里我们只做了一些简单的使用和介绍,后期会不定期更新。
至此SpringBoot事务回滚简单使用就写完了,如有不懂可以加SpringBoot技术交流群14群号:719099151
我是小吾,有问题可以直接在群里@我