【发布时间】:2018-02-14 12:15:30
【问题描述】:
我在 Spring Boot Application 中的服务方法被多个线程访问,一个线程正在修改 DB 中的数据。
当其他线程在第一次提交之前访问数据时,它不会获得先前线程的数据库更新。
在stackoverflow上长时间搜索后,我对相关方法使用了以下注释。
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)
public void accept(Event<String> event) {}
但无法达到预期的结果。未提交的更改不会在第二个线程中检索。
请帮助我解决这个问题。
我使用了实体管理器的 flush() 方法,但没有成功。
【问题讨论】:
-
您的数据库支持哪些隔离级别?更重要的是,为什么要另一个线程读取未提交的数据?提交它不是更好吗?
-
如果你需要访问第一个线程修改的数据,那么你的事务是相互依赖的。
READ UNCOMMITTED不是解决方案。您正在写入/读取哪种数据,为什么需要在提交之前访问它? -
实际上在第一个线程上,我锁定了数据库中的特定数据。所以当它被一个线程访问时,它不应该被其他线程访问。在我的方法中,它首先获取已解锁的数据并为它们加锁并提交给数据库。所以其他线程不应该拿起这些条目。但不幸的是,他们选择了相同的条目,因为它们还没有提交给 DB。
-
我使用的是 PostgreSQL Db,它支持 READ_UNCOMMITTED 隔离。请帮我解决这个问题,我搞砸了。
-
如何“锁定数据库中的特定数据”?
标签: java spring locking spring-data-jpa spring-transactions