事务隔离级别

Spring提供了五种隔离级别:

  • DEFAULT(默认):意思就是数据库用啥我用啥
  • SERIALIZABLE(串行化):事务之间以一种串行的方式执行
  • REPEATABLE READ(可重复读):是MySQL默认的隔离级别,同一个事务中相同的查询会看到同样的数据行
  • READ COMMITED(读已提交):一个事务可以读到另一个事务已经提交的数据
  • READ UNCOMMITED(读未提交):一个事务可以读到另一个事务未提交的数据

除了第一个是Spring新增的,其余的四个都是和「数据库的事务隔离级别」一一对应。

事务传播机制

事务传播机制是指在一个可能含有事务的方法中,调用了另一个可能含有事务的方法,这两个事务应该如何去取舍。最常见的场景就是在Service层。比如OrderService#createOrder()方法里调用了StockService#decreaseStock(),而这两个方法明显都是有事务的。这时,两个事务如何相互影响就是事务传播机制。

 

Spring提供了七种事务传播机制:

  • REQUIRED:Spring「默认值」,如果存在事务,则加入当前事务;如果没有事务,则开启一个新的事务。
  • REQUIRES_NEW:如果当前存在事务,把当前事务挂起,新建事务。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • MANDATORY:如果当前存在事务,则加入当前事务;如果没有事务,就抛出异常。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:支持当前事务,新增Savepoint,与当前事务同步提交或回滚。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

生命周期

Spring管理了对象的生命周期,所以有必要了解Spring到底是怎么管理bean的生命周期的。如果我们想要在bean生命周期的某个时刻执行特定的功能应该怎么办?

Spring bean的生命周期颇为复杂,以下是整个过程,参考org.springframework.beans.factory.BeanFactory

 =>构造方法->调用BeanNameAware的setBeanName方法->调用BeanFactoryAware的setBeanFactory方法->调用ApplicationContextAware的setApplicationContext方法->调用BeanPostProcessor的postProcessBeforeInitialization方法->调用initializingBean的afterProprtiesSet方法->调用init-method指定的初始化方法->调用BeanPostProcessor的postProccessAfterInitialization方法->是用->调用DisableBean的destory方法->调用destory-method指定的销毁方法