gpt4 book ai didi

java - spring-data postgres 事务隔离问题

转载 作者:行者123 更新时间:2023-11-29 13:21:41 24 4
gpt4 key购买 nike

我有两个实体:MessageSessionMessageSession 有一个 @ManyToOne 关系。

我有一个 Spring Data 存储库和操作 A:

@Query("select c from Messages c where c.session.mode=0 and c.field=5")
List<Messages> findMessages();

然后我处理找到的数据

messages.ForEach(message->{
Session session = message.getSession();
sessionClose(session);
newSessionOpen();
})

在我的其他服务等级中

Session session=findOpenedSession();

问题是:

如果事务中的操作 A 在它开始之后和结束之前其他服务将请求打开 Session 或尝试将记录插入到 Message 表中怎么办?

换句话说,我们有:

  1. 交易开始
  2. 正在阅读记录
  3. Session 实例在循环中处理 - Session 使用 sessionClosenewSessionOpen
  4. 交易结束

如果其他进程请求在 2 和 4 或 2 和 3 之间或某处打开 Session 怎么办?那么它会读取哪个打开的Session呢?旧的还是新的?我使用 postgres 和 @Transactional Spring 注释。

最佳答案

假设您问题中的“ session ”总是指您创建的实体。

根据这个:https://www.postgresql.org/docs/9.1/static/transaction-iso.html postgres 的默认隔离级别防止脏读。因此,在该事务提交(即结束)之前,没有其他事务能够看到您在第一个事务中所做的任何更改。

根据同一来源,您可以将事务隔离级别设置为读取未提交。在这种情况下,第二个事务可能能够看到第一个事务所做的更改,尽管第一个事务尚未提交。请注意,虽然对实体的更改不会立即写入数据库,但只会在事务结束之前刷新,显式调用刷新或者如果已配置,则在选择执行之前刷新。因此,尽管您的数据库设置可能允许脏读,但由于 JPA/Hibernate 的行为,您可能不会遇到脏读

关于java - spring-data postgres 事务隔离问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40568676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com