El grupo al cual envías entradas es un grupo Usenet. Si envías mensajes a este grupo, cualquier usuario de Internet podrá ver tu dirección de correo electrónico
Estoy trabajando en un modulo de envió de boletines para mi sistema.
El modulo trabaja usando servicios para todas las tareas (acceso a
base de datos y los propios envios de email)
Realizando los tests de funcionamiento me encontre con este error:
Row was updated or deleted by another transaction (or unsaved-value
mapping was incorrect) for Campaign instance with identifier: 582
Esto sucede cada vez que estoy en el envió de la lista de suscriptores
y alguno de ellos lee el boletin durante el proceso de envió, dado que
el objeto con id, en este caso 582, contiene diferentes valores.
El objecto Campaign contiene un atributo llamado SendMail y otro
llamado ReadMail. El primer atributo es actualizado cada vez que se
envia un email a traves de un evento y el segundo atributo se
actualiza al ser leida.
Espero que esta información os sea de ayuda y me podais echar un cable
con el tema.
El día 15 de mayo de 2008 12:43, TaTe <gaceit...@gmail.com> escribió:
> El objecto Campaign contiene un atributo llamado SendMail y otro > llamado ReadMail. El primer atributo es actualizado cada vez que se > envia un email a traves de un evento y el segundo atributo se > actualiza al ser leida.
1.- El atributo ReadMail se actualiza cada vez que se accede a una
página web user control, este lo que hace es una llamada a la función
UpdateRead(Campaign campaign, User user) del servicio, este realiza
una comprobación del estado del envio a ese usuario en la clase
CampaignQueue (es una cola de campañas con usuarios) y si no ha sido
leida incrementa el número de ReadMails de Campaign.
2.- El atributo SendMail se actualiza constantemente en un evento del
servicio de envio de emails. Cada vez que se envia un email de la
suscripción realiza una llamada a IncSend(int idCampaign, int IdUser).
En este caso consulto la clase Campaign a partir de su identificador e
incremento su atributo SendMail y luego actualizo el estado de envio
de CampaignQueue, todo ello dentro de una transacción.
El problema reside en el momento en el que mientras se esta enviando
mi suscripción un usuario entra a ver el boletin actual de envió al
realizar la llamada de IncSend del envió el session.Update(campaign)
da error, debido a que se produce un descordinacion entre la
información real almacenada en bd a la que contiene mi objecto.
Saludos
On 15 mayo, 18:56, "Fabio Maulo" <fabioma...@gmail.com> wrote:
> El día 15 de mayo de 2008 12:43, TaTe <gaceit...@gmail.com> escribió:
> > El objecto Campaign contiene un atributo llamado SendMail y otro
> > llamado ReadMail. El primer atributo es actualizado cada vez que se
> > envia un email a traves de un evento y el segundo atributo se
> > actualiza al ser leida.
{"Row was updated or deleted by another transaction (or unsaved-value
mapping was incorrect) for Campaign instance with identifier: 585"}
[NHibernate.StaleObjectStateException]: {"Row was updated or
deleted by another transaction (or unsaved-value mapping was
incorrect) for Campaign instance with identifier: 585"}
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
InnerException: null
Message: "Row was updated or deleted by another transaction (or
unsaved-value mapping was incorrect) for Campaign instance with
identifier: 585"
Source: "NHibernate"
StackTrace: " en
NHibernate.Persister.Entity.AbstractEntityPersister.Check(Int32 rows,
Object id, Int32 tableNumber, IExpectation expectation, IDbCommand
statement)\r\n en
NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32
j, Object oldVersion, Object obj, SqlCommandInfo sql,
ISessionImplementor session)\r\n en
NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection,
Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor
session)\r\n en NHibernate.Impl.ScheduledUpdate.Execute()\r\n en
NHibernate.Impl.SessionImpl.Execute(IExecutable executable)\r\n en
NHibernate.Impl.SessionImpl.ExecuteAll(IList list)\r\n en
NHibernate.Impl.SessionImpl.Execute()\r\n en
NHibernate.Impl.SessionImpl.Flush()\r\n en
Castle.Facilities.NHibernateIntegration.SessionDelegate.Flush()\r\n
en DataAccess.CampaignDao.SaveCampaign(Campaign campaign)\r\n en
ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.InvocationSaveCampaign_10 .InvokeMethodOnTarget()
\r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r\n en
Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Int ercept(IInvocation
invocation)\r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r
\n en
ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.SaveCampaign(Campaign
campaign)\r\n en SaveCampaign(Campaign campaign)\r\n en
Web.EditCampaign_send.DoWork(Object _context)"
TargetSite: {Void Check(Int32, System.Object, Int32,
NHibernate.AdoNet.IExpectation, System.Data.IDbCommand)}
1. ¿con test de funcionamiento te referís a test unitarios o a una persona usando la página web?. 2. Si es sobre una web, ¿estás guardando los objetos (en la sessión de ASP.NET por ejemplo) entre postbacks o lo lees de la DB en cada request?. 3. Si estamos hablando de test unitarios, ¿estos son con mulithread?.
> 1. ¿con test de funcionamiento te referís a test unitarios o a una
> persona usando la página web?.
> 2. Si es sobre una web, ¿estás guardando los objetos (en la sessión de
> ASP.NET por ejemplo) entre postbacks o lo lees de la DB en cada
> request?.
> 3. Si estamos hablando de test unitarios, ¿estos son con mulithread?.
> Saludos.
> Nelo.
> On Fri, May 16, 2008 at 4:58 AM, TaTe <gaceit...@gmail.com> wrote:
> > Adjunto el error al detalle:
> > {"Row was updated or deleted by another transaction (or unsaved-value
> > mapping was incorrect) for Campaign instance with identifier: 585"}
> > [NHibernate.StaleObjectStateException]: {"Row was updated or
> > deleted by another transaction (or unsaved-value mapping was
> > incorrect) for Campaign instance with identifier: 585"}
> > Data: {System.Collections.ListDictionaryInternal}
> > HelpLink: null
> > InnerException: null
> > Message: "Row was updated or deleted by another transaction (or
> > unsaved-value mapping was incorrect) for Campaign instance with
> > identifier: 585"
> > Source: "NHibernate"
> > StackTrace: " en
> > NHibernate.Persister.Entity.AbstractEntityPersister.Check(Int32 rows,
> > Object id, Int32 tableNumber, IExpectation expectation, IDbCommand
> > statement)\r\n en
> > NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
> > Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32
> > j, Object oldVersion, Object obj, SqlCommandInfo sql,
> > ISessionImplementor session)\r\n en
> > NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
> > Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection,
> > Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor
> > session)\r\n en NHibernate.Impl.ScheduledUpdate.Execute()\r\n en
> > NHibernate.Impl.SessionImpl.Execute(IExecutable executable)\r\n en
> > NHibernate.Impl.SessionImpl.ExecuteAll(IList list)\r\n en
> > NHibernate.Impl.SessionImpl.Execute()\r\n en
> > NHibernate.Impl.SessionImpl.Flush()\r\n en
> > Castle.Facilities.NHibernateIntegration.SessionDelegate.Flush()\r\n
> > en DataAccess.CampaignDao.SaveCampaign(Campaign campaign)\r\n en
> > ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.InvocationSaveCampaign_10 .InvokeMethodOnTarget()
> > \r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r\n en
> > Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Int ercept(IInvocation
> > invocation)\r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r
> > \n en
> > ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.SaveCampaign(Campaign
> > campaign)\r\n en SaveCampaign(Campaign campaign)\r\n en
> > Web.EditCampaign_send.DoWork(Object _context)"
> > TargetSite: {Void Check(Int32, System.Object, Int32,
> > NHibernate.AdoNet.IExpectation, System.Data.IDbCommand)}
Tate, ¿es una aplicación web? ¿estás guardando los objetos en la session de asp.net entre postbacks?
mis preguntas van orientadas a darme una idea si el problema viene por algo mapeado incorrectamente o por un problema real de concurrencia. ¿como estás manejando la session de nhibernate? ¿probaste de implementar un contro de concurrencia en el objeto? (nhibernate lo tiene resuelto y es muy fácil implementarlo)
On Fri, May 16, 2008 at 10:00 AM, TaTe <gaceit...@gmail.com> wrote:
> La idea es hacer test unitarios pero primero estaba realizando las > pruebas yo mismo.
> Todo el sistema se base en la cache del sistema y en todas las > funciones de escritura existe un session.Flush() para liberar la > información
> On 16 mayo, 14:30, "Nelo Pauselli" <nelopause...@gmail.com> wrote: >> Hola TaTe, te hago unas consultas:
>> 1. ¿con test de funcionamiento te referís a test unitarios o a una >> persona usando la página web?. >> 2. Si es sobre una web, ¿estás guardando los objetos (en la sessión de >> ASP.NET por ejemplo) entre postbacks o lo lees de la DB en cada >> request?. >> 3. Si estamos hablando de test unitarios, ¿estos son con mulithread?.
>> Saludos. >> Nelo.
>> On Fri, May 16, 2008 at 4:58 AM, TaTe <gaceit...@gmail.com> wrote:
>> > Adjunto el error al detalle:
>> > {"Row was updated or deleted by another transaction (or unsaved-value >> > mapping was incorrect) for Campaign instance with identifier: 585"} >> > [NHibernate.StaleObjectStateException]: {"Row was updated or >> > deleted by another transaction (or unsaved-value mapping was >> > incorrect) for Campaign instance with identifier: 585"} >> > Data: {System.Collections.ListDictionaryInternal} >> > HelpLink: null >> > InnerException: null >> > Message: "Row was updated or deleted by another transaction (or >> > unsaved-value mapping was incorrect) for Campaign instance with >> > identifier: 585" >> > Source: "NHibernate" >> > StackTrace: " en >> > NHibernate.Persister.Entity.AbstractEntityPersister.Check(Int32 rows, >> > Object id, Int32 tableNumber, IExpectation expectation, IDbCommand >> > statement)\r\n en >> > NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, >> > Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32 >> > j, Object oldVersion, Object obj, SqlCommandInfo sql, >> > ISessionImplementor session)\r\n en >> > NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, >> > Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, >> > Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor >> > session)\r\n en NHibernate.Impl.ScheduledUpdate.Execute()\r\n en >> > NHibernate.Impl.SessionImpl.Execute(IExecutable executable)\r\n en >> > NHibernate.Impl.SessionImpl.ExecuteAll(IList list)\r\n en >> > NHibernate.Impl.SessionImpl.Execute()\r\n en >> > NHibernate.Impl.SessionImpl.Flush()\r\n en >> > Castle.Facilities.NHibernateIntegration.SessionDelegate.Flush()\r\n >> > en DataAccess.CampaignDao.SaveCampaign(Campaign campaign)\r\n en >> > ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.InvocationSaveCampaign_10 .InvokeMethodOnTarget() >> > \r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r\n en >> > Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Int ercept(IInvocation >> > invocation)\r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r >> > \n en >> > ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.SaveCampaign(Campaign >> > campaign)\r\n en SaveCampaign(Campaign campaign)\r\n en >> > Web.EditCampaign_send.DoWork(Object _context)" >> > TargetSite: {Void Check(Int32, System.Object, Int32, >> > NHibernate.AdoNet.IExpectation, System.Data.IDbCommand)}
> Tate, ¿es una aplicación web? ¿estás guardando los objetos en la
> session de asp.net entre postbacks?
> mis preguntas van orientadas a darme una idea si el problema viene por
> algo mapeado incorrectamente o por un problema real de concurrencia.
> ¿como estás manejando la session de nhibernate? ¿probaste de
> implementar un contro de concurrencia en el objeto? (nhibernate lo
> tiene resuelto y es muy fácil implementarlo)
> Saludos.
> Nelo.
> On Fri, May 16, 2008 at 10:00 AM, TaTe <gaceit...@gmail.com> wrote:
> > La idea es hacer test unitarios pero primero estaba realizando las
> > pruebas yo mismo.
> > Todo el sistema se base en la cache del sistema y en todas las
> > funciones de escritura existe un session.Flush() para liberar la
> > información
> > On 16 mayo, 14:30, "Nelo Pauselli" <nelopause...@gmail.com> wrote:
> >> Hola TaTe, te hago unas consultas:
> >> 1. ¿con test de funcionamiento te referís a test unitarios o a una
> >> persona usando la página web?.
> >> 2. Si es sobre una web, ¿estás guardando los objetos (en la sessión de
> >> ASP.NET por ejemplo) entre postbacks o lo lees de la DB en cada
> >> request?.
> >> 3. Si estamos hablando de test unitarios, ¿estos son con mulithread?.
> >> Saludos.
> >> Nelo.
> >> On Fri, May 16, 2008 at 4:58 AM, TaTe <gaceit...@gmail.com> wrote:
> >> > Adjunto el error al detalle:
> >> > {"Row was updated or deleted by another transaction (or unsaved-value
> >> > mapping was incorrect) for Campaign instance with identifier: 585"}
> >> > [NHibernate.StaleObjectStateException]: {"Row was updated or
> >> > deleted by another transaction (or unsaved-value mapping was
> >> > incorrect) for Campaign instance with identifier: 585"}
> >> > Data: {System.Collections.ListDictionaryInternal}
> >> > HelpLink: null
> >> > InnerException: null
> >> > Message: "Row was updated or deleted by another transaction (or
> >> > unsaved-value mapping was incorrect) for Campaign instance with
> >> > identifier: 585"
> >> > Source: "NHibernate"
> >> > StackTrace: " en
> >> > NHibernate.Persister.Entity.AbstractEntityPersister.Check(Int32 rows,
> >> > Object id, Int32 tableNumber, IExpectation expectation, IDbCommand
> >> > statement)\r\n en
> >> > NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
> >> > Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32
> >> > j, Object oldVersion, Object obj, SqlCommandInfo sql,
> >> > ISessionImplementor session)\r\n en
> >> > NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
> >> > Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection,
> >> > Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor
> >> > session)\r\n en NHibernate.Impl.ScheduledUpdate.Execute()\r\n en
> >> > NHibernate.Impl.SessionImpl.Execute(IExecutable executable)\r\n en
> >> > NHibernate.Impl.SessionImpl.ExecuteAll(IList list)\r\n en
> >> > NHibernate.Impl.SessionImpl.Execute()\r\n en
> >> > NHibernate.Impl.SessionImpl.Flush()\r\n en
> >> > Castle.Facilities.NHibernateIntegration.SessionDelegate.Flush()\r\n
> >> > en DataAccess.CampaignDao.SaveCampaign(Campaign campaign)\r\n en
> >> > ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.InvocationSaveCampaign_10 .InvokeMethodOnTarget()
> >> > \r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r\n en
> >> > Castle.Facilities.AutomaticTransactionManagement.TransactionInterceptor.Int ercept(IInvocation
> >> > invocation)\r\n en Castle.DynamicProxy.AbstractInvocation.Proceed()\r
> >> > \n en
> >> > ICampaignDaoProxy57f8a141904e41c080e30db4b0039abe.SaveCampaign(Campaign
> >> > campaign)\r\n en SaveCampaign(Campaign campaign)\r\n en
> >> > Web.EditCampaign_send.DoWork(Object _context)"
> >> > TargetSite: {Void Check(Int32, System.Object, Int32,
> >> > NHibernate.AdoNet.IExpectation, System.Data.IDbCommand)}
Bueno, me parece haver encontrado la solución al problema.
De momento estoy testeando y no me esta dando problemas aparentes.
La solución que he tomado ha sido en refrescar el objeto campaign
antes de realizar los cambios. de esta manera me aseguro tener lo
último en la sesión.