事物的传播机制
Spring 事务的传播机制有以下 7 种类型:
- REQUIRED
REQUIRED 是默认的传播机制。如果当前方法已经有了一个事务,那么调用方法将在该事务中执行;如果当前方法没有事务,那么调用方法将开启一个新的事务。
- SUPPORTS
SUPPORTS 表示当前方法支持事务,但是如果调用方法没有事务,那么当前方法不会开启事务。
- MANDATORY
MANDATORY 表示当前方法必须在一个事务中执行,如果调用方法没有事务,那么将会抛出异常。
- REQUIRES_NEW
REQUIRES_NEW 表示当前方法必须开启一个新的事务,如果调用方法已经有了一个事务,那么该事务将被挂起,当前方法将在新的事务中执行。
- NOT_SUPPORTED
NOT_SUPPORTED 表示当前方法不应该在事务中执行,如果调用方法有事务,那么该事务将被挂起,当前方法将在没有事务的上下文中执行。
- NEVER
NEVER 表示当前方法不应该在事务中执行,如果调用方法有事务,那么将会抛出异常。
- NESTED
NESTED 表示当前方法将在一个嵌套的事务中执行,如果调用方法已经有了一个事务,那么当前方法将嵌套在该事务中执行;如果调用方法没有事务,那么当前方法将开启一个新的事务。
使用场景
Spring 事务的传播机制可以根据不同的场景进行选择。下面是一些常见的使用场景:
- REQUIRED
REQUIRED 是最常用的传播机制,适用于大多数场景。例如,一个业务方法需要调用多个方法来完成一个业务流程,这些方法需要在同一个事务中执行,这时可以使用 REQUIRED 传播机制。
- SUPPORTS
SUPPORTS 适用于读取数据的方法。例如,一个方法只是读取数据库的数据,不需要进行事务管理,这时可以使用 SUPPORTS 传播机制。
- MANDATORY
MANDATORY 适用于必须在事务中执行的方法。例如,一个方法需要修改数据库的数据,如果不在事务中执行,那么数据将无法提交,这时可以使用 MANDATORY 传播机制。
- REQUIRES_NEW
REQUIRES_NEW 适用于需要独立事务的方法。例如,一个业务方法需要调用一个需要独立事务的方法,这时可以使用 REQUIRES_NEW 传播机制。
- NOT_SUPPORTED
NOT_SUPPORTED 适用于不需要在事务中执行的方法。例如,一个方法只是查询数据库的数据,不需要进行事务管理,这时可以使用 NOT_SUPPORTED 传播机制。
- NEVER
NEVER 适用于不允许在事务中执行的方法。例如,一个方法需要修改数据库的数据,但是不允许在事务中执行,这时可以使用 NEVER 传播机制。
- NESTED
NESTED 适用于需要嵌套事务的方法。例如,一个业务方法需要调用一个需要嵌套事务的方法,这时可以使用 NESTED 传播机制。