java - Spring中的同步事务方法

标签 java spring spring-mvc synchronization synchronized

我们的代码中有以下方法,该方法具有 Transactional 注释并且已同步。

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public synchronized void addValueToDB(String value, int parent) {
  int nextId = getNextIDUsingSequence();
  insertIntoDB(nextId, value);
  updateLeft(parent);
  updateRight(parent);
}

现在,由于 Transactional 注释在方法完成后提交到数据库中,因此此方法的同步对我来说似乎毫无用处? spring 是否为此提供了任何解决方案,或者我应该从调用此方法的位置同步块(synchronized block)?

最佳答案

事务和同步是两个不同的东西:

  1. TX(交易)意味着您的代码不会看到与它一起运行的其他 TX 的影响(在某种程度上......),但不会阻止其他 TX 运行。例如,您可以尝试从 2 个 TX 更改同一数据库行。一个(第一个提交的)将成功,另一个将失败。

  2. 同步可以防止多个线程同时执行您的方法(在类的同一个实例上。您的类是单例吗?)。它提供了更强大的隔离

您需要决定需要哪两个

关于java - Spring中的同步事务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427021/

相关文章:

java - SpringMVC : Is it possible to define more than one path on the form tag?

java - 使用 SimpleMailMessage() 发送邮件时 Spring 中的 NullPointerException

java - 关闭内部包含 JInternalFrame 的 JtabbedPane

java - 有什么办法可以延迟PaintComponent吗?

java - 为什么我在制作 Spring 项目时会收到​​未暴露于 weaver 的警告?

spring - 如何安排 Spring Boot 批量应用程序

java - 使用 @InjectMocks 注入(inject) String 属性

java - 从 Java 泛型方法参数中排除枚举

spring - GWT 前端的最佳 java webframe 后端?

java - 造成原因:java.lang.NoClassDefFoundError:org/springframework/web/context/request/async/CallableProcessingInterceptor