docs: #322 preventing parallel same data update-related-sections (model+code/ no db migrations)

This commit is contained in:
Hamid Reza Mohammadi 2022-05-20 11:01:10 +04:30
parent 583b7c86ed
commit 0f49151d67
4 changed files with 86 additions and 0 deletions

View File

@ -487,5 +487,11 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<GanjoorPoemSectionCorrection> GanjoorPoemSectionCorrections { get; set; }
/// <summary>
/// Updating related sections logs
/// </summary>
public DbSet<UpdatingRelSectsLog> UpdatingRelSectsLogs{ get; set; }
}
}

View File

@ -0,0 +1,30 @@
using System;
namespace RMuseum.Models.Ganjoor
{
/// <summary>
/// Updating related sections logs
/// </summary>
public class UpdatingRelSectsLog
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; }
/// <summary>
/// meter id
/// </summary>
public int MeterId { get; set; }
/// <summary>
/// rhyme letters
/// </summary>
public string RhymeLettes { get; set; }
/// <summary>
/// date/time
/// </summary>
public DateTime DateTime { get; set; }
}
}

View File

@ -2978,6 +2978,11 @@
section correctons
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.UpdatingRelSectsLogs">
<summary>
Updating related sections logs
</summary>
</member>
<member name="T:RMuseum.Models.Accounting.DonationExpenditure">
<summary>
donation expenditures
@ -8096,6 +8101,31 @@
couplets (virtual) for Masnavi
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.UpdatingRelSectsLog">
<summary>
Updating related sections logs
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.UpdatingRelSectsLog.Id">
<summary>
id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.UpdatingRelSectsLog.MeterId">
<summary>
meter id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.UpdatingRelSectsLog.RhymeLettes">
<summary>
rhyme letters
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.UpdatingRelSectsLog.DateTime">
<summary>
date/time
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.VersePoemSectionType">
<summary>
how GanjoorPoemSection is linked to GanjoorVerse

View File

@ -53,6 +53,19 @@ namespace RMuseum.Services.Implementation
{
try
{
if (await context.UpdatingRelSectsLogs.AsNoTracking()
.Where(l => l.MeterId == metreId && l.RhymeLettes == rhyme && l.DateTime > DateTime.Now.AddMinutes(-10)).AnyAsync())
return new RServiceResult<bool>(true);//prevent parallel updates for same data
var log = new UpdatingRelSectsLog()
{
MeterId = metreId,
RhymeLettes = rhyme,
DateTime = DateTime.Now
};
context.Add(log);
await context.SaveChangesAsync();
var sections = await context.GanjoorPoemSections.AsNoTracking()
.Where(section => section.GanjoorMetreId == metreId && section.RhymeLetters == rhyme && section.SectionType == PoemSectionType.WholePoem)
.ToListAsync();
@ -61,11 +74,18 @@ namespace RMuseum.Services.Implementation
{
await _UpdateSectionRelatedSectionsInfoNoSaveChanges(context, section, poetsImagesUrls, true);
}
var logs = await context.UpdatingRelSectsLogs
.Where(l => l.MeterId == metreId && l.RhymeLettes == rhyme).ToListAsync();
context.RemoveRange(logs);
await context.SaveChangesAsync();
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
var logs = await context.UpdatingRelSectsLogs
.Where(l => l.MeterId == metreId && l.RhymeLettes == rhyme).ToListAsync();
context.RemoveRange(logs);
return new RServiceResult<bool>(false, exp.ToString());
}
}