💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
添加事务步骤如下: **1. 启动类添加注解`@EnableTransactionManagement`开启事务支持** ```java @SpringBootApplication @MapperScan("com.example.sboot.dao") @EnableTransactionManagement public class SbootApplication { public static void main(String[] args) { SpringApplication.run(SbootApplication.class, args); } } ``` **2. 在service层的方法上添加注解`@Transactional`开启事务** 你可以在接口方法上添加或者在接口实现类的方法上添加都可以。 ```java public interface StudentService { //在接口的方法上添加 @Transactional int batchInserts(List<Student> studentList); } ``` ```java @Service public class StudentServiceImpl implements StudentService { @Autowired private StudentDao studentDao; @Override @Transactional //或者在接口实现类的方法上添加 public int batchInserts(List<Student> studentList) { for (int i = 0; i < studentList.size(); i++) { Student student = studentList.get(i); if (i == 4) { int d = 10 / 0; //除0异常 } studentDao.insert(student); } return studentList.size(); } } ``` **3. 测试事务效果** ```java @RestController @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService; @RequestMapping("/batch/insert") public void batchInsert() { List<Student> studentList = new ArrayList<>(1); studentList.add(new Student("李四", 20, "男")); studentList.add(new Student("王五", 21, "男")); studentList.add(new Student("赵六", 22, "男")); studentList.add(new Student("田七", 23, "男")); studentList.add(new Student("周八", 24, "男")); int result = studentService.batchInsert(studentList); System.out.println(result); } } ``` 当插入第4条数据时发生除0异常,查看数据库没有被任何修改,事务配置成功。 <br/> 事务其他参数配置:*`org.springframework.transaction.annotationl.Transactional`* ```java @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; //事务传播行为:当事务方法被另一个事务方法调用时,指定事务应该如何传播。 //(1)REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则就启动一个新的事务,并在自己的事务内运行。 //(2)REQUIRED_NEW:当前方法必须启动事务,并在它自己的事务内运行,如果有事务正在运行,应该将他挂起。 //(3)SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则他可以不运行在事务中。 //(4)NOT_SUPPORTE:当前的方法不应该运行在事务中,如果有运行的事务,将他挂起。 //(5)MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常。 //(6)NEVER:当前方法不应该运行在事务中,如果有运行的事务,就抛出异常。 //(7)NESTED:如果有事务在运行,当前的方法就应该在这个事物的嵌套事务内运行, // 否则,就启动一个新的事务,并在它自己的事务内运行。 Propagation propagation() default Propagation.REQUIRED; //事务隔离级别。 //(1)READ_UNCOMMITTED:读未提交。允许事务A读取事务B未提交的修改。 //(2)READ_COMMITTED:读已提交。要求事务A只能读取事务B已提交的修改。 //(3)REPEATABLE_READ:可重复读。确保事务A可以多次从一个字段中读取到相同的值, // 即事务A执行期间禁止其它事务对这个字段进行更新。 //(4)SERIALIZABLE:串行化。确保事务A可以多次从一个表中读取到相同的行, // 在事务A执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。 Isolation isolation() default Isolation.DEFAULT; //超时时间:事务需要在一定时间内进行提交,如果不提交进行回滚 //-1为永不超时,以秒单位进行计算。 int timeout() default -1; //是否只读,false为可以查询,可以添加修改删除操作 //读:查询操作 //写:添加修改删除操作 boolean readOnly() default false; //指定出现哪些异常进行事务回滚 Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; //指定出现哪些异常不进行事务回滚 Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; } ```