常见的隔离级别和传播行为
1、隔离级别
Serializable: 最严格,串行处理,消耗资源大
Repeatable Read:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据
Read Committed:大多数主流数据库的默认事务等级
Read Uncommitted:保证了读取过程中不会读取到非法数据。
2、讲解常见的传播行为
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常
---------------------------------------------------------------------
SpringBoot整合Mybatis之事务处理实战
在service逻辑引入事务 @Transantional(propagation=Propagation.REQUIRED)
测试代码如下:
package net.xdclass.base_project.service;
import java.util.List;
import net.xdclass.base_project.domain.User;
public interface UserService {
public int add(User user);//添加
public List<User> getAll();//查找全部
public User findById(Long id);//根据id查询
public void update(User user);//更新对象
public void delete(Long userId);//根据id删除用户
/**
* 功能描述:测试事务
* @return
*/
public int addAccount();
}
package net.xdclass.base_project.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import net.xdclass.base_project.domain.User;
import net.xdclass.base_project.mapper.UserMapper;
import net.xdclass.base_project.service.UserService;
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public int add(User user) {
userMapper.insert(user);
int id = user.getId();
return id;
}
@Override
public List<User> getAll() {
return userMapper.getAll();
}
@Override
public User findById(Long id) {
return userMapper.findById(id);
}
@Override
public void update(User user) {
userMapper.update(user);
}
@Override
public void delete(Long userId) {
userMapper.delete(userId);
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public int addAccount() {
User user = new User();
user.setAge(88);
user.setCreateTime(new Date());
user.setName("加入事务啊");
user.setPhone("10010099");
userMapper.insert(user);
int i = 19 / 0;//抛出异常
return 0;
}
}
控制器:
/**
* 功能描述:测试事务
* @return
*/
@GetMapping("/add_account")
public Object addAccount(){
int id = userService.addAccount();
return JsonData.buildSuccess(id);
}
启动spring容器,访问如下:
此时,控制台和页面都会抛出异常,由于控制器中先插入了一条数据,然后抛出异常,配置了事务后,会自动回滚,数据插入不成功