@transactional(propagation = propagation.supports)
时间: 2023-05-31 20:20:19 浏览: 296
### 回答1:
`@transactional(propagation = propagation.supports)` 是 Spring 框架中的一个注解,用于指定事务的传播行为为“支持当前事务,如果不存在则不开启事务”。也就是如果当前方法正在运行在一个具有事务的上下文中,则支持这个事务;否则不会开启新的事务。这个注解通常用于查询或读取操作,不需要对数据库进行更改或写入操作。
### 回答2:
@Transactional(propagation = propagation.supports) 是 Spring 框架中的一个注解,可以应用在方法或类级别上,用于声明事务处理的方式。其中 propagation 属性用于定义事务的传播方式,而 supports 表示当前方法或类支持加入已有的事务中,如果不存在事务,则不会开启新的事务。本文将从以下几方面对其进行详细解析。
1. 事务的传播方式
Spring 框架中事务的传播方式共有七种,分别是:
- PROPAGATION_REQUIRED:默认传播方式,如果当前存在事务则加入该事务,如果不存在则创建新事务。
- PROPAGATION_SUPPORTS:如果当前存在事务则加入该事务,如果不存在则以非事务方式执行。
- PROPAGATION_MANDATORY:强制要求当前存在事务,如果不存在则抛出异常。
- PROPAGATION_REQUIRES_NEW:如果存在事务则挂起当前事务,创建新的事务执行。如果不存在事务则创建新事务执行。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前存在事务则挂起事务。
- PROPAGATION_NEVER:以非事务方式执行,如果存在事务则抛出异常。
- PROPAGATION_NESTED:使用 JDBC 3.0 Savepoint 进行事务控制,如果当前存在事务则嵌套在该事务中执行。
2. 当前支持事务加入
使用 @Transactional(propagation = propagation.supports) 注解的方法或类,在当前已存在的事务中运行。如果没有当前事务,则该方法不会启动新的事务,而是以非事务方式执行。
3. 注意事项
- 具有相同或更高优先级的事务可以添加到正在运行的事务中。
- 如果当前没有正在运行的事务,并且事务管理器支持这样做,则方法将以非事务方式运行。
- 如果当前没有正在运行的事务,并且事务管理器不支持非事务方式,则会抛出异常。
- 使用 @Transactional 注解时应该密切关注传播级别,否则可能会产生一些不必要的麻烦。
总之,@Transactional(propagation = propagation.supports) 是一个非常有用的注解,可以帮助我们声明 Spring 事务处理的方式。使用 supports 作为传播属性,可以让当前方法或类支持加入已有的事务中,而不创建新的事务。对于一些只需要读取数据或执行一些非关键操作的方法,使用 supports 方式可以节约系统资源并提高系统性能。
### 回答3:
在Spring中,@Transactional注解是一个非常重要的注解,它用于声明方法需要在事务中执行。使用这个注解可以很方便地管理事务,无需手动编写繁琐的事务管理代码。其中,propagation是@Transaction注解的一个属性,用于指定事务的传播行为。
在@Transaction中,propagation属性有多个取值:
1. PROPAGATION_REQUIRED (默认值):表示必须要启动一个新的事务,如果当前没有事务,则新建一个,如果当前已经存在事务,则加入该事务。
2. PROPAGATION_SUPPORTS:表示当前方法不需要事务,但如果当前存在事务,则加入该事务,即支持当前事务。
3. PROPAGATION_MANDATORY:表示当前方法必须在一个已经存在的事务中执行,否则将抛出异常。
4. PROPAGATION_REQUIRES_NEW:表示当前方法必须启动一个新的事务,如果当前已经存在事务,则挂起当前事务并启动一个新的事务。
5. PROPAGATION_NOT_SUPPORTED:表示当前方法不应该在事务中执行,如果当前存在事务,则挂起该事务。
6. PROPAGATION_NEVER:表示当前方法不应该在事务中执行,如果当前存在事务,则抛出异常。
7. PROPAGATION_NESTED:表示当前方法必须在一个已经存在的事务中执行,如果当前没有事务,则新建一个事务。如果当前存在事务,当前方法会被嵌套在该事务中执行,即嵌套事务。
而针对于@transactional(propagation = propagation.supports),它的作用是声明当前方法不需要事务,但是如果当前已经存在事务,则会加入当前事务中执行。这种传播行为通常用于一些查询方法,比如查询用户信息等,此时不需要对数据进行修改,只需要读取数据就可以了。
总之,@transactional(propagation = propagation.supports)表示当前方法不需要事务,但如果当前存在事务,则加入该事务,即支持当前事务。这种传播行为通常用于一些查询方法,比如查询用户信息等,这样可以减少数据库连接的开销,提高查询效率。
阅读全文