spring事务传播机制

理解spring事务,就要理解数据库ACID的Isolation,隔离性。

脏读、不可重复读、幻读

这几种场景都是针对多个事务并发处理的情况

  • 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
  • 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
  • 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

SQL的事务隔离级别

  • 未提交读(Read Uncommitted):一个事务能够读取到 别的事务中没有提交的更新数据。事务可以读取到未提交的数据,这也被称为脏读(dirty read)。所以这种级别很有可能读到脏数据,隔离级别最低。

  • 提交读(Read Committed):一个事务只能读取到别的事务提交的更新数据。一般我们提交读就可以了。只能读取到已经提交的数据。即解决了脏读,但未解决不可重复读。(oracle默认的)

  • 可重复读(Repeated Read):保证同一事务中先后执行的多次查询将返回同意结果,不受其他事务的影响。这种隔离级别可能出现幻读。(mysql默认的)

  • 序列化(Serializable):不允许事务并发执行,强制事务串行执行,就是在读取的每一行数据上都加上了锁,读写相互都会阻塞。这种隔离级别最高,是最安全的,性能最低,不会出现脏读,不可重复读,幻读,丢失更新。

数据库通过 set transaction-isolation xxx 设置事务隔离级别。

Spring事务传播

可以参见 https://blog.csdn.net/qq_17085835/article/details/84837253 的解释。

  • 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)
    如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

小结

spring的事务传播机制,是解决函数调用的时候事务传播问题,理解清楚非常有必要。

你可能感兴趣的:(spring事务传播机制)