使用注解模式不需要配置文件,也不需要配置事务配置类或者方法,只需要使用“@Transcation”注解引入到相对应的位置即可实现事务回滚功能。
1.引入pom.xml
<!-- 事物 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
2.在controller里面使用事务注解(因为service和接口层都是直接操作数据库的方法,一般需要多个操作或者循环的Controller才需要事务支持,如果是mybatis批量操作数据库语句也不需要事务)
事务作用域一般常见的分成两种:
①定义在类上面 :所有的方法都支持事务
②定义在方法上 :只有该方法支持事务
package com.Transaction.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.Transaction.entity.Alarmtype;
import com.Transaction.mapper.AlarmtypeMapper;
import com.Transaction.service.AlarmtypeService;
@Controller
//@Transactional //事务级别,如果该类中同时操作多个方法,只要失败则全部回滚
public class AlarmtypeController {
@Autowired
AlarmtypeMapper alarmtypeMapper;
@Autowired
AlarmtypeService alarmtypeService;
@RequestMapping("index")
public synchronized String index(){
//List<Alarmtype> list = alarmtypeMapper.getAlarmtypeList();
List<Alarmtype> list = alarmtypeService.findAll();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getId()+"--"+list.get(i).getAlarmname());
}
return "index";
}
//批量插入
@RequestMapping("addBatch")
@ResponseBody
@Transactional//对整个方法进行事务处理,方法体内只要有一个方法没执行成功则全部回滚
public synchronized int addBatch(){
Alarmtype alarmtype = new Alarmtype();
Alarmtype updatealarmtype = new Alarmtype();
updatealarmtype.setId(1);
updatealarmtype.setAlarmname("修改前轮故障");
alarmtypeMapper.updateAlarmtypeById(updatealarmtype);
int result = 0;
try {
for (int i = 0; i < 5; i++) {
if(i==2){
//alarmname在数据库中长度不超过50,赋值超过50报异常 Data too long
alarmtype.setAlarmname("测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");
alarmtype.setAlarmtypeid(i);
}else{
alarmtype.setAlarmname("测试"+i);
alarmtype.setAlarmtypeid(i);
}
result = alarmtypeMapper.addAlarmtype(alarmtype);
}
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
@RequestMapping("test")
@ResponseBody
public synchronized String test(){
return "test";
}
}
补充:在spring boot配置文件使用默认配置的情况下,如果使用try catch方法处理,如果发生异常,catch体里面的操作数据库的方法实际测试显示不执行,会提示有回滚操作,所以需要捕捉错误信息并插入自定义数据库表单的时候是不会执行的。