Spring事物和常规事物有哪些

158 阅读1分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」

spring事物

 @Override
 public Map<StringObjectstartTransaction(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
 }
  • 但是呢?我们再去数据库查看,发现该数据进入数据库了。

image-20220123165751122.png

  • 发生这种场景时不行的,在互联网中我们要求部分接口必须具有原子性,中途报错之前所有的操作就必须回滚。如果我们自己使用jdbc那么直接通过连接对象rollback就行了。
  • 在spring中因为连接session对接管了,我们就不必那么麻烦了,直接通过@Transactional标注我们的方法就可以实现事物了。
 @Transactional
 public Map<StringObjectstartTransaction(Transmodel transmodel) {
   int insert = transMapper.insert(transmodel);
   log.info("操作日志:" + insert);
   if ("zxhtom".equals(transmodel.getName())) {
     throw new RuntimeException("error");
  }
   return new HashMap<>();
 }
  • 在此执行就会发现,数据并没有新增,这就是我们想要的效果

spring事物有哪些可配项

image-20220123170516789.png

  • 里面有几个属性我们需要关注下。已经圈出来了。

image-20220123171940651.png

字段作用
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;
 }
 ​
 }