「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
spring事物
@Override
public Map<String, Object> startTransaction(Transmodel transmodel) {
int insert = transMapper.insert(transmodel);
log.info("操作日志:" + insert);
if ("zxhtom".equals(transmodel.getName())) {
throw new RuntimeException("error");
}
return new HashMap<>();
}
- 上面代码逻辑非常的简单,当我们传送如下参数时就会报错
{
"name": "zxhtom",
"code": "56",
"age": 34
}
- 但是呢?我们再去数据库查看,发现该数据进入数据库了。
- 发生这种场景时不行的,在互联网中我们要求部分接口必须具有原子性,中途报错之前所有的操作就必须回滚。如果我们自己使用jdbc那么直接通过连接对象rollback就行了。
- 在spring中因为连接session对接管了,我们就不必那么麻烦了,直接通过
@Transactional标注我们的方法就可以实现事物了。
@Transactional
public Map<String, Object> startTransaction(Transmodel transmodel) {
int insert = transMapper.insert(transmodel);
log.info("操作日志:" + insert);
if ("zxhtom".equals(transmodel.getName())) {
throw new RuntimeException("error");
}
return new HashMap<>();
}
- 在此执行就会发现,数据并没有新增,这就是我们想要的效果
spring事物有哪些可配项
- 里面有几个属性我们需要关注下。已经圈出来了。
| 字段 | 作用 |
|---|---|
| value | 事物管理器;用于提交和回滚的功能;默认的DataSourceTransactionManager内部时datasource来操作提交回滚的 |
| transactionManager | 事物管理器;用于提交和回滚的功能;默认的DataSourceTransactionManager内部时datasource来操作提交回滚的 |
| propagation | 传播属性;spring中方法内方法事物传递属性设置 |
| isolation | 隔离级别,在数据库基础上新增一个默认以数据库隔离级别为准 |
| timeout | 超时事物不提交 |
| readOnly | 这个感觉没啥意义,被标注的方法无法执行更新操作,只能select |
| rollbackFor | 导致事务回滚的异常类数组 |
| rollbackForClassName | 导致事务回滚的异常类名字数组 |
| noRollbackFor | 不会导致事务回滚的异常类数组 |
| noRollbackForClassName | 不会导致事务回滚的异常类名字数组 |
传播属性
- 传播属性spring为我们建立了枚举
public enum Propagation {
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
NEVER(TransactionDefinition.PROPAGATION_NEVER),
NESTED(TransactionDefinition.PROPAGATION_NESTED);
private final int value;
Propagation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}