He estado recibiendo informes de error de frecuencia razonable de mis usuarios, una típica es:conflicto LINQ - No encontró fila o cambiado
Error Message: Row not found or changed.
Stack Trace:
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at Controls_Article_ArticleViewer.LoadArticle()
at ViewTutorial.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
(que puedo dar más detalles si es necesario). El único código LINQ directa en esa función LoadArticle()
es:
using (MainContext db = new MainContext())
{
var q = (
from A in db.tblArticles
where A.ID == this.ArticleID && A.IsDeleted == false
select A
).SingleOrDefault();
if (q == null)
{
Server.Transfer("~/404.aspx");
Context.Response.End();
}
else
{
// Cache expired for HTML generation
if (q.HTMLLastGenerated.AddSeconds(Settings.ArticleRegenHTMLCacheSecs) < DateTime.Now)
{
q.Body = ArticlesCommon.Markdown(q.MarkupBody);
q.HTMLLastGenerated = DateTime.Now;
}
q.Views++;
q.LastView = DateTime.Now;
db.SubmitChanges();
// Set passbakcs
this.AuthorID = q.AuthorID;
this.Anchor = q.Anchor;
this.SectionID = q.SectionID;
this.Views = q.Views;
this.DatePublished = q.Date;
ArticleAnchor = q.Anchor;
ArticleAuthorID = q.AuthorID;
// Get the latest edit
ArticleEdit LatestEdit = ArticleEditCommon.GetLatestEdit(this.ArticleID);
// An edit exists!
if (LatestEdit.ID != 0)
{
this.Description = LatestEdit.Description;
this.ArticleTitle = LatestEdit.Title;
ArticleBody.Text = LatestEdit.Body;
ArticleH1.Text = ArticleTitle;
}
// No edits
else
{
this.Description = q.Description;
this.ArticleTitle = q.Title;
ArticleBody.Text = q.Body;
ArticleH1.Text = ArticleTitle;
}
// Get toal comments
TotalComments = (from C in db.tblComments where C.IsDeleted == false && C.Anchor == ArticleAnchor select new { C.ID }).Count();
// Get author details
var qq = (from A in db.tblForumAuthors where A.Author_ID == ArticleAuthorID select new { A.Username }).Single();
AuthorUsername = qq.Username;
}
}
Puede haber otras funciones en LoadArticle
que hacen referencia a los métodos que se ejecutan LINQ, pero estoy adivinando el StackTrace saldría de manera diferente, por lo que el código anterior es la causa .
¿Alguna idea de qué podría causar esto? Un conflicto de datos? ¿Cómo se resuelve este tipo de error usualmente?
¿Alguna idea de qué podría causar esto?
actualizaciones simultáneas a la misma fila podrían desencadenar este. ¿Hay algún riesgo de eso? – bzlm
@Bzlm, supongo que sí, el campo 'LastViewed' podría sufrir de eso, no he construido nada para manejar esto en el sitio. Aumenté la tasa de indexación de Google de mi sitio, así que este tipo de cosas es más probable, supongo. –
y también el 'ArticlesCommon.Markdown (q.MarkupBody)' va a ser bastante lento, probablemente sea el culpable, el que se ejecuta cuando alguien está tratando de verlo, y las ideas de cómo resolverlo? –