l

什么是Spring事务?

Spring 事务是在数据库事务的基础上进行封装扩展:

  • 支持原有的数据库事务的隔离级别,加入了事务传播的概念
  • 提供多个事务的合并或隔离的功能
  • 提供声明式事务(@Transactional),让业务代码与事务分离,减少代码侵入,事务变得更易用 (AOP)

总的来说就是能够更加简便的管理事务,不管是不同方法公用同一个事务或者是不同方法有自己的事务

Spring事务应用

Spring事务管理类型

编程式事务

通过 TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用

声明式事务

标注@Transactional注解

Spring事务属性TransactionDefinition

隔离级别(Isolation Level)

和数据库的隔离级别基本一样

  • DEFAULT:使用数据库默认的隔离级别。
  • READ_UNCOMMITTED:允许读取未提交的数据。
  • READ_COMMITTED:只允许读取已提交的数据。
  • REPEATABLE_READ:确保多次读取的结果是一致的。
  • SERIALIZABLE:提供严格的事务隔离,以避免幻读。

传播行为(Propagation Behavior)

传播行为定义了事务的边界,那调用链中的子方法,是用一个新事务,还是使用当前事务呢?

这里假设A方法调用B方法

  • REQUIRED(默认常用):A方法和B方法共用同一个事务
  • MANDATORY:A方法没有事务则抛出异常,否则A方法和B方法共用同一个事务
  • REQUIRES_NEW(操作的独立性):B方法自己新建一个事务,共两个事务,A方法异常不会影响B方法
  • NESTED(允许只回滚B方法事务):B方法自己新建一个事务,共两个事务,A方法异常会影响B方法

不常用

  • SUPPORTS:如果A方法存在事务,则B方法加入该事务,如果A方法没有事务则以非事务方式执行
  • NOT_SUPPORTED:以非事务方式执行
  • NEVER:以非事务方式执行,如果存在事务则抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
Class A {
@Autowired
B b;
@Transactional(propagation = Propagation.xxx)
public void aMethod {
//do something
b.bMethod();
}
}

@Service
Class B {
@Transactional(propagation = Propagation.xxx)
public void bMethod {
//do something
}
}

只读标志(Read-Only Flag)

只读标志可以帮助数据库优化事务,如果所有的数据操作都是读取操作,则可以将事务标记为只读。

超时设置(Timeout)

超时设置定义了事务的最长运行时间,如果超出这个时间,则事务会被回滚。

回滚异常类型(rollbackFor)

可以自定义哪些异常需要被捕捉然后回滚代码。

Spring事务失效

  • 非public方法上使用@Transactional
  • 非事务方法调用事务方法
  • 数据库或数据库引擎不支持事务

Spring事务原理