@Transactional,方法内方法
@Transactional, method inside method
我有一个服务,其中一个方法调用另一个方法。在第一种方法中,我只使用 SELECT 执行查询,但他们必须看到在第二种方法中完成的插入和更新。
然后,我要处理交易。我正在使用 Spring,所以我可以使用 @Transactional 注释。
以下哪个选项更适合您?
选项 A
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
选项 B
public void generate(){
// selects
save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
谢谢!!
理想情况应该是
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
public void save(Object a){
//save the object
}
即会使用生成方法的事务。如果发生任何异常,您可以全部回滚。如果你想覆盖行为。使用传播行为
例如:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Object a){
//save the object
}
经过一番研究,我会自己回答。如果您认为我错了,请告诉我一些事情:P
首先,我认为这两个选项都是正确的,这取决于你的业务逻辑。我的意思是,当一个方法必须在同一个事务中完成时,它应该是事务性的,这取决于程序员和业务逻辑。
例如,如果 'generate' 方法包含要在 同一事务 中完成的逻辑,则选项 A 是正确的,因此如果生成方法中的某些内容失败,则所有更改被撤消。在这种情况下,保存方法中的 Transactional 注解是不必要的。
选项 A
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
//@Transactional
public void save(Object a){
//save the object
}
如果您的交易(取决于您的业务逻辑)仅在保存方法中,则选项 B 也是正确的。但是,如果您使用 Spring 和 AOP(方面),则选项 B 有问题。 Spring在使用AOP的时候使用了proxies,所以如果需要调用带有Transactional注解的save方法,就得使用代理让Spring调用事务中的保存方法。
选项 B
private MyClass self; // this is the proxy bean of this class!
public void generate(){
// selects
self.save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
我有一个服务,其中一个方法调用另一个方法。在第一种方法中,我只使用 SELECT 执行查询,但他们必须看到在第二种方法中完成的插入和更新。
然后,我要处理交易。我正在使用 Spring,所以我可以使用 @Transactional 注释。
以下哪个选项更适合您?
选项 A
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
选项 B
public void generate(){
// selects
save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
谢谢!!
理想情况应该是
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
public void save(Object a){
//save the object
}
即会使用生成方法的事务。如果发生任何异常,您可以全部回滚。如果你想覆盖行为。使用传播行为
例如:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Object a){
//save the object
}
经过一番研究,我会自己回答。如果您认为我错了,请告诉我一些事情:P
首先,我认为这两个选项都是正确的,这取决于你的业务逻辑。我的意思是,当一个方法必须在同一个事务中完成时,它应该是事务性的,这取决于程序员和业务逻辑。
例如,如果 'generate' 方法包含要在 同一事务 中完成的逻辑,则选项 A 是正确的,因此如果生成方法中的某些内容失败,则所有更改被撤消。在这种情况下,保存方法中的 Transactional 注解是不必要的。
选项 A
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
//@Transactional
public void save(Object a){
//save the object
}
如果您的交易(取决于您的业务逻辑)仅在保存方法中,则选项 B 也是正确的。但是,如果您使用 Spring 和 AOP(方面),则选项 B 有问题。 Spring在使用AOP的时候使用了proxies,所以如果需要调用带有Transactional注解的save方法,就得使用代理让Spring调用事务中的保存方法。
选项 B
private MyClass self; // this is the proxy bean of this class!
public void generate(){
// selects
self.save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}