Spring托管事务@Transactional注释
传播设置是必需的Spring托管事务@Transactional注释,spring,jpa,transactions,spring-transactions,Spring,Jpa,Transactions,Spring Transactions,传播设置是必需的 @Transactional(propagation = Propagation.REQUIRED) 事务是读/写的 在哪种情况下使用这些?请给我举个例子解释一下这个注释只是为了帮助Spring框架管理您的数据库事务 假设您有一个向数据库写入数据的服务bean,并且您希望确保在您使用的事务中完成写入 @Transactional(propagation = Propagation.REQUIRED) 下面是Spring服务bean的一个小示例 @Service class
@Transactional(propagation = Propagation.REQUIRED)
事务是读/写的
在哪种情况下使用这些?请给我举个例子解释一下这个注释只是为了帮助Spring框架管理您的数据库事务 假设您有一个向数据库写入数据的服务bean,并且您希望确保在您使用的事务中完成写入
@Transactional(propagation = Propagation.REQUIRED)
下面是Spring服务bean的一个小示例
@Service
class MyService {
@Transactional(propagation = Propagation.REQUIRED)
public void writeStuff() {
// write something to your database
}
}
Transactional
注释告诉Spring:
- 此服务方法需要在事务中执行
- 如果在执行服务方法时引发异常,Spring将回滚事务,并且不会向数据库写入任何数据
- Spring事务默认为
@Transactional(propagation = Propagation.REQUIRED)
因此,不需要指定传播属性
那么,spring组件的@Transactional
注释是什么意思?- Spring框架将启动一个新事务并执行所有方法,最后提交事务。
- 但如果
应用程序上下文中不存在任何事务,则spring容器将启动一个新事务
- 如果将多个方法配置为
,则事务行为以嵌套方式分配给逻辑中的每个方法,但它们都在同一物理事务下Propagation.REQUIRED
结果是,如果任何嵌套事务失败,那么整个事务将失败并回滚(不要在db中插入任何值),而不是提交 例如:
@Service
public class ServiceA{
@Transactional(propagation = Propagation.REQUIRED)
public void foo(){
fooB();
}
@Transactional(propagation = Propagation.REQUIRED)
public void fooB(){
//some operation
}
}
说明:
在本例中,foo()
方法分配了一个事务性行为,在foo()
内部调用了另一个方法fooB()
,该方法也是事务性的。
这里的
fooB()
充当foo()
中的嵌套事务。如果fooB()
由于任何原因失败,则foo()
也无法提交。相反,它会回滚。可能与主题无关,但我只想指出,如果从foo()调用fooB()上的@Transactional注释,它将绕过负责事务管理的spring代理,因此没有任何效果。