spring事务

 

原理 

spring会创建一个jdbc的连接,并且关闭自动提交,等事务中的代码都执行完成后再提交。以动态代理的方式去管理事务。

 

简单分类

spring事务分两种,一种是编程式事务TransactionTemplate或PlatformTransactionManager,推荐使用TransactionTemplate,这是内嵌到方法中的事务,代码比较臃肿,但也有优势  它能给部分代码加事务部分代码不加。

@Autowired
private TransactionTemplate transactionTemplate;
public void testTransaction() {

        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

                try {

                    // ....  业务代码
                } catch (Exception e){
                    //回滚
                    transactionStatus.setRollbackOnly();
                }

            }
        });
}

 

一种是声明式事务处理

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

 Propagation propagation() default Propagation.REQUIRED;
 Isolation isolation() default Isolation.DEFAULT;
  int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
  boolean readOnly() default false;

}

@Transaction作用在类中,该类所以的public 方法将具备事务属性
@Transaction作用在方法中,该方法将具备事务属性

propagation 传播特性

  required: 有事务就用当前事务,没事务就创建一个事务

  required_new:创建新事物

  support: 有事务就用事务,没事务就不用事务

isolation:事务隔离级别

  default:数据库默认的级别

timeout:超时时间,超时未执行完成会自动回滚

readonly:只读,为保证该事务中每次查询的数据都是一致的。

rollbackfor:回滚的异常,默认只在runtimeException和error时候才回滚,其他情况不回滚。加rollbackFor = Exception.class 出现所有的异常将回滚,否则只回滚RuntimeException

 

事务失效原因

@Transaction修饰的方法,非public

@Transaction所在类没有初始化成bean

数据库的引擎不支持事务(mysql数据库Innodb支持事务,myISAM不支持)

propagation设置问题 (propogation.NOT_SUPPORT不支持事务)
try catch导致已经捕获到异常,不抛出异常

 

参考:https://blog.csdn.net/weixin_45711797/article/details/126041812

posted on 2021-05-17 14:36  周公  阅读(38)  评论(0编辑  收藏  举报

导航