Ich entwickle ein Projekt mit WebAPI und Entity Framework 6.Wie ändert man eine parallele Datenbank sequentiell?
Es gibt einen Controller mit einer Methode, die der Datenbank einen neuen Entity Task hinzufügt. Vor der Add-Task wurde ein eindeutiger Name für sie berechnet. Ein Teil des Namens basiert auf den bereits gespeicherten Aufgaben in der Datenbank. Wenn Sie zwei parallele Anfragen stellen, können Sie die gleichen Namen generieren, dieses Problem wird durch Sperren gelöst.
Wie kann ich die Erzeugung identischer Namen verhindern, wenn zwei WebAPI-Server mit einer Verbindung zur selben Datenbank ausgeführt werden?
Ist es möglich, den Algorithmus zum Hinzufügen von Task zu einer sequenziellen Warteschlange auf Datenbankebene hinzuzufügen?
Vereinfachte Code:
[HttpPost]
[Route("add")]
public IHttpActionResult AddTask()
{
using (var db = CreateDbContext())
{
Task task = new Task();
lock (lockAdd)
{
DateTime dateTime = DateTime.UtcNow;
string preName = dateTime.ToString("yyMMdd-HHmm-");
var query = db.Tasks.Where(t => t.Name.StartsWith(preName)).Select(t => t.Name);
List<string> tasksNames = query.ToList();
task.Name = preName + (tasksNames.Count + 1).ToString("D4");
db.Tasks.Add(task);
db.SaveChanges();
}
return Ok();
}
}
Сolumn "Name" kann nicht eindeutig gemacht werden. Aufgaben wurden nie gelöscht. Zähler muss für jedes neue Datum (neue Minute) von 1 ausgehen.
Der einfachste Weg wäre wahrscheinlich, die Logik in die Datenbank einzufügen und den Wert von dort zurückzugeben (vielleicht ein Insert-Trigger). So wird es immer richtig gehandhabt. Andernfalls müssen Sie einen eindeutigen Index haben und Ausnahmen behandeln, wenn derselbe Name eingefügt wird. –