Spring事务

一、Spring 事务的定义

Spring事务是Spring框架提供的一种便捷的进行数据库事务运行提交的方法,使用Spring事务可以大大降低数据库事务编程的复杂度。

二、Spring事务的分类

Spring事务包括编程式事务和声明式事务两种,声明式事务更简单,常用。

  1. 编程式事务
    编程式事务需要用到两个变量,DataSourceTransactionManager(事务管理器)和TransactionDefinition(事务定义)。
    Spring事务_第1张图片
    注入这两个变量后,就可以再函数中使用这两个变量。
    编程式事务的过程:
    开启事务->编写事务定义->提交事务
    1. 开启事务
      在这里插入图片描述
      讲事务的定义作为参数传给事务管理器的方法getTransaction。
      getTransaction会返回一个事务状态TransactionStatus。
    2. 编写事务定义
      开启事务代码写完之后,就能在后面的代码编写事务定义。
      在这里插入图片描述
      后续的代码都会被看做是事务操作,在内存中直接运行,直到事务提交。
    3. 事务提交
      在这里插入图片描述
      事务管理器调用方法commit,将传入事务定义transactionDefinition后返回的事务状态transactionStatus作为参数传给commit,就能将事务提交,将数据库操作持久化到硬盘。
    4. 事务回滚
      为了保证事务的ACDI特性,当事务提交之前出现任何异常,那事务就不能进行提交,必须进行回滚。所以要将事务的开启,事务定义的编写,事务的提交这段逻辑用try catch语句封装起来,如果出现异常就要执行回滚操作rollback。
      Spring事务_第2张图片

总结:

向事务管理中传入事务定义就是开启了一个事务了,返回了一个事务状态对象。
后续代码就可以编写事务的业务代码,编写完之后可以用事务状态对象调用提交事务方法commit。可以使用trycatch将传入事务定义获取事务状态和事务业务代码包裹起来,在异常处理里面写上事务回滚(也是事务状态对象的方法),就实现了事务正常执行就提交,事务不正常执行就回滚的业务逻辑,也就实现了事务。

  1. 声明式事务
    声明式事务就比较简单了,只需要在需要使用到事务的类或者方法前面写上注释@Transaction,就默认方法的所有执行内容都被当做事务的执行内容了,执行出现异常也会自动进行回滚。
    注意:

    • @Transaction只对public修饰的方法有效,修饰类时,表示类的所有public方法执行都被看做是事务执行,修饰方法时,只有当方法是public时才有效。
      Spring事务_第3张图片
  2. 声明式事务的参数
    Spring事务_第4张图片
    下面重点介绍几个常用的参数

    • isolation
      这个参数表示的了Spring事务的隔离级别,数据库事务的隔离级别有四种分别是read uncommited,read commited,repeatable read,serializable四种隔离级别。
      Spring事务的隔离级别有五种,是上面这四种加上default。
      Spring事务_第5张图片
      default代表按照数据库默认的隔离级别,大多数数据库默认的隔离级别都是read commited。
      Spring事务_第6张图片

    • propagation
      这个参数可以设置事务的传播机制,具体可以在事务的七种传播机制查看。

    • timeout
      设置事务的超时时间,默认值为-1,代表没有超时时间,单位为秒,如果事务执行时间超过超时时间则会自动回滚,需要谨慎使用。

      @Transactional(timeout = 60) // 设置事务的超时时间为 60 秒
      public void someTransactionalMethod() {
          // 执行事务操作
      }
      

你可能感兴趣的:(spring,数据库,java)