【发布时间】:2012-05-30 16:24:51
【问题描述】:
什么是 Spring 中 TransactionScope(.Net) 的等效类。
【问题讨论】:
-
@TransactionAttribute(TransactionAttributeType.MANDATORY)
标签: java .net spring transactions spring-transactions
什么是 Spring 中 TransactionScope(.Net) 的等效类。
【问题讨论】:
@TransactionAttribute(TransactionAttributeType.MANDATORY)
标签: java .net spring transactions spring-transactions
@Transactional 注释看起来等效。
这可以放在类和方法上,可以通过传播、隔离、回滚等来定义。
【讨论】:
我对 .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 实际上可能会在您的交易过程中发生一小段时间的变化。您可以简单地通过在测试中发送垃圾邮件来测试它。
它可能不是您的需求所必需的,所以我很难说(显然您的需求可能早已过去,但很有希望。虽然这对将来的某人有所帮助)
【讨论】: