
@Transactional@Transactional
@Override
public void delete(Integer id) {
//1. 删除部门
deptMapper.delete(id);
int i = 1/0; //模拟抛出异常
//2. 根据部门id,删除部门下的员工信息
empMapper.deleteByDeptId(id);
}
// 部门接口类
@Transactional
public interface DeptService {
// CODE...
}
// 部门接口实现类
@Transactional
@Service
public class DeptServiceImpl implements DeptService {
// CODE...
}Spring中配置开启事务管理日志,开启之后可以在调试窗口看到事务
# 开启事务管理日志
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug事务管理员:发起事务时,在Spring中通常指代业务层开启事务的方法,负责发起事务,决定事务的开始与提交/回滚
事务协调员:加入事务后,在Spring中通常指代数据层方法,也可以是业务层方法,负责参与已有事务,在事务中执行具体的数据库操作或业务逻辑。
角色 | 含义 | 在 Spring 中的对应 | 举例 |
|---|---|---|---|
事务管理员(Transaction Initiator) | 负责发起事务,决定事务的开始与提交/回滚。 | 通常指 业务层方法(Service 层) 上声明了 |
|
事务协调员(Transaction Participant) | 负责参与已有事务,在事务中执行具体的数据库操作或业务逻辑。 | 通常是 数据访问层(DAO 层) 或其他 被同一事务包裹的业务方法。 这些方法通常也是 |
|
示例代码:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private LogService logService;
@Transactional // 事务管理员
public void registerUser(User user) {
userRepository.save(user); // 事务协调员
logService.logRegistration(user); // 若 logService 使用 REQUIRED,也为协调员
}
}
@Service
public class LogService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logRegistration(User user) {
// 新事务,成为自己的事务管理员
// 不影响外层 registerUser() 的事务
}
}默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。
@Transactional(rollbackFor = Exception.class) // 回滚
default boolean saveBatch(Collection<T> entityList) {
return saveBatch(entityList, DEFAULT_BATCH_SIZE);
}属性 | 作用 | 示例 |
|---|---|---|
readOnly | 设置是否为只读事务 | readOnly=true 只读事务 |
timeout | 设置事务超时时间 | timeout = -1(永不超时) |
rollbackFor | 设置事务回滚异常(class) | rollbackFor = {NullPointerException.class} |
rollbackForClassName | 设置事务回滚异常(String) | 同上格式为字符串 |
noRollbackFor | 设置事务不回滚异常(class) | noRollbackFor = {NullPointerException.class} |
noRollbackForClassName | 设置事务不回滚异常(String) | 同上格式为字符串 |
propagation | 设置事务传播行为 | …… |
属性值 | 含义 |
|---|---|
REQUIRED | 【默认值】需要事务,有则加入,无则创建新事务 |
REQUIRES_NEW | 需要新事务,无论有无,总是创建新事务 |
SUPPORTS | 支持事务,有则加入,无则在无事务状态中运行 |
NOT_SUPPORTED | 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务 |
MANDATORY | 必须有事务,否则抛异常 |
NEVER | 必须没事务,否则抛异常 |
NESTED | 如果当前事务存在,则在嵌套事务中执行,内层事务以来外层事务,如果外层失败,则会回滚内层,内层失败不影响外层。 |
@Transactional
public void a() {
//......
userService.b();
//......
}
@Transactional(propagation = Propagation.REQUIRED)
public void b() {
//......
}REQUIRED:大部分情况下都是用该传播行为即可。
REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。