Springboot事务的使用
Springboot事务介绍
Springboot开启事务很简单, 只需要一个注解
@Transactional
就可以了, 因为在 Springboot 中已经默认对JPA, JDBC, Mybatis开启了事务, 引入它们依赖的时候, 事务就默认开启. 当然, 如果你需要用其他的ORM框架, 比如 Beat1SQL, 就需要自己配置相关的事务管理器. Springboot用于配置事务的类为
TransactionAutoConfiguration
, 在 Springboot中, 无须显示开启使用@EnableTransactionManagement
.
类级别事务
@Transactional
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public User findByPK(String id) {
return userMapper.selectByPrimaryKey(id);
}
}
上述代码在 UserServiceImpl 中开启事务, 在 类级别 上使用注释开启, 一般事务都是 加在服务层 ,
@Transactional
注解在类上, 意味着此类的所有 public 方法都是开启事务的.
方法级别事务
@Transactional
除了可以注解在类上, 还可以注解到**方法**上面. 当注解在类上时, 意味着此类中所有的public方法都是开启事务的. 如果 类级别 和 方法级别 同时使用了@Transactional
注解, 那么方法级别注解就会 覆盖 类级别注解.
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Transactional
@Override
public int save(User user) {
int count = userMapper.insert(user);
String error = null;
error.split("/");
return count;
}
}
我在 save()
方法添加事务, 同时在save完成之后抛出NullPointException
异常, 查看数据是否可以回转.
@SpringBootTest
@RunWith(SpringRunner.class)
class MybatisplusApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
User user = new User();
user.setDeletetag(false);
user.setName("uwei");
user.setId("217");
user.setAge(20);
user.setEmail("777@qq.com");
userService.save(user);
}
}
运行后,由于
save
是开启事务进行保存数据, 当执行insert后, 如果方法正常执行结束就会提交事务
, 然后数据就会更新到数据库, 但是上面再执行insert后, 抛出了一个 异常, 导致方法没有正常结束, 所以 数据会回滚, 检查下数据库, 数据库并没有新增这条user记录. 然后我取消在
UserserviceImpl
中save()
方法上的@Transactional
注解, 再执行一次, 可以发现即使insert后面抛出了异常, 数据还是会持久化到数据库.
Over
如果觉得需要更多技术干货, 来我的CSDN 和 GitHub哦
CSDN: https://blog.csdn.net/dummyo
Github: https://github.com/uweii