EF核心并发时使用多个实例

0

的问题

我的代码类似于这样的:

var records = db.Records.Where(r => r.IsProcessing == false).Take(100).ToList();
records.IsProcessing = true;
await db.SaveChangesAsync()
...further work with recods

如果这代码运行在几个实例microsevice,可以一并发问题发生? (I.e。 两种服务将得到相同的一组记录)。 如果是的-我怎么阻止它?

我想要阻止我的服务得到同样的记录从数据库,如果他们叫这个方法同时进行。

2

最好的答案

1

你可以检索的行存储的过程,运行于一个序列化的交易。 你可能需要的其他特性在表,类似的东西AssignedTo其中记录了服务分配给该行,另一个属性的指示处理已经完成。 否则,如果服务检索的某些行,但失败之前完成所有的处理,这些行仍然未经处理的。 当服务检索行,它可以使用的条件,如AssignedTo=自或AssignedTo是空。 大概还有一个时间戳或一些其他办法可以优先选择行。

2021-11-23 23:26:52
1

是的,它会,它可能不那么容易预防。

想象一下这些服务的任务是更新账户余额。 他们阅读的平衡,以及增加金额:

service 1: on a busy machine (slow)
service 2: on a not so busy machine (fast)
"john" has £100 on his account
service 1: read
service 2: read
service 1: balance = balance + 100;
service 2: balance = balance + 100;
service 2: set processing = true
service 2: set processing = true
service 2: update record
service 1: update record.
john ends up with £200 instead of £300.

你会需要引入一个交易的范围内,管理有穿红衣也许, 所以,每个实例中有一点真的检查,如果它是好的,更新的范围。 一个"IsProcessing? 或SetIsProcessing"通过网络如果你会。

2021-11-23 21:26:46

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................