gpt4 book ai didi

sql-server - 并发 - Spring + Hibernate + SQL Server

转载 作者:行者123 更新时间:2023-12-04 11:38:56 24 4
gpt4 key购买 nike

即使在spring事务中使用了可序列化隔离级别后,我也遇到了并发问题。我的用例是用户将以以下格式提供要在数据库中更新的配置。

{A1: [B1, B2, B3]}
我必须将其保存在下面的实体中。
A {
@OneToMany
List<B> bList;
}

B {
@ManyToOne
A a;

Boolean isDeleted;
}
当有并发请求保存配置时,插入的 B 比预期的多。请引用以下场景。
Initial enitites in database: A1 -> []

Transaction 1 - given config {A1: [B2]}

Reads A1 -> []
Insert B2

Transaction 2 - given config {A1: [B3]}

Reads A1 -> []
Insert B3

Final in database: A1 -> [B2, B3] when expected is either A1 -> [B2, B3-deleted] or A1 -> [B2-deleted, B3].
即使经过大量研究,我也无法找到解决此问题的适当方法。
根据这篇文章 ( https://sqlperformance.com/2014/04/t-sql-queries/the-serializable-isolation-level ),当使用 SQL Server 时,这种情况总是可能的,因为操作顺序是有效的序列化之一。

最佳答案

这最好通过引入一个用于乐观锁定的版本列来处理。不需要使用 SERIALIZABLE 隔离级别。只需使用

A {
@Version
long version;
@OneToMany
List<B> bList;
}
并确保您使用 LockModeType.OPTIMISTIC_FORCE_INCREMENT加载 A 时.这样,“序列化”将基于您所谓的“聚合根”的锁,即 A .
通过这样做,一个事务将成功,另一个将失败,因为在每个事务结束时,只有在此期间值没有更改时,版本列才会增加。如果它同时发生变化,它将回滚两个事务之一,您将看到 OptimisticLockException。

关于sql-server - 并发 - Spring + Hibernate + SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69014760/

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