Spring与事务处理

 Spring事务处理是很重要的一个知识点,下面来简单总结下基本知识,加深理解和记忆。

参考资料:https://blog.****.net/donggua3694857/article/details/69858827

    https://blog.****.net/Java_3y/article/details/86711521

        《高性能MySQL》


1、数据库事务的ACID属性:

    例子:从Jack的账户转200元到Tom的账户:

    步骤:1)检查Jack的账号是否够200元;

           2)Jack账号减去200元;

          3)Tom账号增加200元。

Spring与事务处理

Spring与事务处理

 

2、 4种数据库事务的隔离级别:

Spring与事务处理

Spring与事务处理

3、Spring事务的传播行为

名称 解释
Propagation.REQUIRED 0 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是Spring默认的事务的传播。
Propagation.SUPPORT 1 支持当前事务,如果当前没有事务,就以非事务方式执行。

Propagation.MANDATORY

2 支持当前事务,如果当前没有事务,就抛出异常。

Propagation.REQUIRES_NEW

3 新建事务,如果当前存在事务,把当前事务挂起。

Propagation.NOT_SUPPORTED

4 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

Propagation.NEVER

5 以非事务方式执行,如果当前存在事务,则抛出异常

Propagation.NESTED

6 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与Propagation.REQUIRED类似的操作。

 

3.2、Spring事务的传播机制  

    如果是在本类中没有事务的方法来调用标注注解@Transactional方法,最后的结论是没有事务的。由于Spring声明式事务管理用的是AOP,所以在没有事务的方法中拿到的是代理对象,是没有事务存在的。

    在本类中有事务的方法调用其他方法(不管是否有事务),都属于事务传播机制的知识范畴。

 

4、事务超时:

    为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。

 

5、 事务回滚规则:

    事务五边形的最后一个方面是一组规则,这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚 但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。

6、Spring事务管理的几个重要接口

    Spring事务可以分为两种:

  • 编程式事务(通过代码的方式来实现事务)
  • 声明式事务(通过配置的方式来实现事务,可以细分为aop,xml配置和@transaction注解)

6.1 在编程式事务中有以下几个重要的接口:

TransactionDefinition:定义了Spring兼容的事务属性(比如事务隔离级别、事务传播、事务超时、是否只读状态)

TransactionStatus:代表了事务的具体运行状态(获取事务运行状态的信息,也可以通过该接口间接回滚事务等操作)

PlatformTransactionManager:事务管理器接口(定义了一组行为,具体实现交由不同的持久化框架来完成—类比JDBC)

 

6.2 在声明式事务中,除了TransactionStatus和PlatformTransactionManager接口,还有几个重要的接口:

TransactionProxyFactoryBean:生成代理对象

TransactionInterceptor:实现对象的拦截

TransactionAttrubute:事务配置的数据


参考资料:https://blog.****.net/donggua3694857/article/details/69858827

    https://blog.****.net/Java_3y/article/details/86711521

        《高性能MySQL》