【发布时间】:2021-10-31 00:21:24
【问题描述】:
即使在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 时,这种情况总是可能发生的,因为操作顺序是有效的序列化之一。
【问题讨论】:
标签: sql-server hibernate concurrency spring-data