0

什么是 Spring 中 TransactionScope(.Net) 的一个有点等价的类。

4

2 回答 2

0

@Transactional注释看起来是等价的。

这可以放在类和方法上,并且可以通过传播、隔离、回滚等来定义。

于 2012-05-30T16:31:33.613 回答
0

我对 .Net 完全一无所知,所以我不确定这是否是您正在寻找的。您可以使用SimpleTransactionScope以在事务的整个生命周期中维护对象。默认情况下它没有注册,所以你必须像任何自定义范围一样在 spring core 中注册它,并给它一个字符串名称。然后,如果您愿意,您还可以专门创建一个注释来注册一个。

几年前,在这个问题被确定之后,我的问题就提出了这个建议。我们特别要求它用于跨多种方法注入服务的时间戳。你可以做这样的事情。

public class SimpleTransactionFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
        factory.registerScope("transaction", new SimpleTransactionScope());
    }
}

@Configuration
class MyConfiguration {

    @Scope(scopeName = "transaction")
    @Bean
    Instant nowInstant() {
       return Instant.now();
    }

}
@Service
class MyService {

    private final ObjectFactory<Instant> nowFactory;

    MyService( @Qualifier("nowInstant") ObjectFactory<Instant> nowFactory ) {
       this.nowFactory = nowfactory
    }

    @Transactional
    public boolean nowisEqualAlways() {
       var now = nowFactory.getObject();
       var sameNow = nowFactory.getObject();
       return Objects.equals( now, sameNow );
    }
}

如果您不这样做,您now实际上可能会在交易期间更改一小段时间。您可以简单地通过在测试中发送垃圾邮件来测试它。

您的需求可能不需要它,所以我很难说(很明显,您的需求可能早已过去,很有希望。尽管这对将来的某人有所帮助)

于 2021-08-18T22:29:55.257 回答