首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发异常

并发异常
EN

Stack Overflow用户
提问于 2018-12-11 18:09:27
回答 1查看 131关注 0票数 0

我是唯一使用这个系统的用户,这段代码抛出一个并发异常,我所要做的就是更新状态并添加采用该任务的用户

OptimisticConcurrencyException:存储update、insert或delete语句影响到意外的行数(0)。实体可能已被修改或删除,因为实体是加载的。有关理解和处理乐观并发异常的信息,请参见http://go.microsoft.com/fwlink/?LinkId=472540

代码语言:javascript
复制
     namespace GoldMine.View.Notification.Home.Process {
   using PageInstruction = GraphiteGTC.Core.View.Element.Model.PageInstruction;
    using Notification = GoldMine.Model.Notification;
    using User = GoldMine.Model.User;
    using NotificationApprovalStatus = GoldMine.Model.NotificationApprovalStatus;
    using ButtonTypeOption = GoldMine.Model.ButtonTypeOption;

    /// <summary>
    ///
    /// Class housing the logic for OnClickAdoptApproveTaskButtonProcess
    ///
    /// </summary>
    public class OnClickAdoptApproveTaskButtonProcess : GoldMineViewProcess {
        /// <summary>
        ///
        /// View process inputs
        ///
        /// </summary>
        public new OnClickAdoptApproveTaskButtonProcessInputs Inputs {
            get { return ( OnClickAdoptApproveTaskButtonProcessInputs )base.Inputs; }
            set { base.Inputs = value; }
        }

        /// <summary>
        ///
        /// View process outputs
        ///
        /// </summary>
        public new OnClickAdoptApproveTaskButtonProcessOutputs Outputs {
            get { return ( OnClickAdoptApproveTaskButtonProcessOutputs )base.Outputs; }
            set { base.Outputs = value; }
        }

        /// <summary>
        ///
        /// UI outputs
        ///
        /// </summary>
        public OnClickAdoptApproveTaskButtonProcessUiOutputs UiOutputs {
            get { return new OnClickAdoptApproveTaskButtonProcessUiOutputs( Outputs ); }
        }

        /// <summary>
        ///
        /// Default parameter-less constructor
        ///
        /// </summary>
        public OnClickAdoptApproveTaskButtonProcess() {
            Name = "GoldMine.View.Notification.Home.Process.OnClickAdoptApproveTaskButtonProcess";
            Inputs = new OnClickAdoptApproveTaskButtonProcessInputs();
            Outputs = new OnClickAdoptApproveTaskButtonProcessOutputs();
            base.Outputs = Outputs;
            base.Inputs = Inputs;
            DelayedPropertyAssignments = new List<DelayedPropertyAssignment>();
        }

        /// <summary>
        ///
        /// Entry point for event processing
        ///
        /// </summary>
        protected override GraphiteGTCProcess ExecuteProcess( GTCEventRegistration executingEventRegistration ) {
            return base.ExecuteProcess( Inputs.EventRegistration );
        }

        /// <summary>
        ///
        /// Entry point for Business Logic Processing
        ///
        /// </summary>
        protected override GraphiteGTCProcess ExecuteForwardProcessing() {
            try {
                Outputs = new OnClickAdoptApproveTaskButtonProcessOutputs();

                Outputs.SessionToken = UiStringConverter.CreateSessionToken( Inputs.CurrentUser );
                Debugging.DebugWorker.Current.BeginProcess();
                Debugging.DebugWorker.Current.SetVariableValue( "ButtonType", Inputs.ButtonType );
                Debugging.DebugWorker.Current.SetVariableValue( "CurrentNotification", Inputs.CurrentNotification );
                Debugging.DebugWorker.Current.SetVariableValue( "PageInstructions", Outputs.PageInstructions );
                Debugging.DebugWorker.Current.SetVariableValue( "CurrentUser", Inputs.CurrentUser );
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "092c84bf-423e-454b-8efa-00749bc691ef" );

                // ShapeComment:[Create List of Page Instructions][b60bbb93-3a06-4a57-ace3-6024f91c94a0][4bf395e3-e0a1-4304-b987-dcdae594a524]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "4bf395e3-e0a1-4304-b987-dcdae594a524" );
                Outputs.PageInstructions = new List<PageInstruction>();
                Debugging.DebugWorker.Current.SetVariableValue( "PageInstructions", Outputs.PageInstructions );

                // ShapeComment:[Get Receiver][b60bbb93-3a06-4a57-ace3-6024f91c94a0][6b9c89cc-79c7-4957-8164-9a0c25da7652]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "6b9c89cc-79c7-4957-8164-9a0c25da7652" );
                #region Execute FindReceiverFromNotification Process

                var notificationFindReceiverFromNotificationProcess = new Notification( true ).FindReceiverFromNotificationProcess;
                notificationFindReceiverFromNotificationProcess.Inputs.EventRegistration = Inputs.EventRegistration;
                notificationFindReceiverFromNotificationProcess.Inputs.CurreuntUser = Inputs.CurrentUser;
                notificationFindReceiverFromNotificationProcess.Inputs.Notification = Inputs.CurrentNotification;
                notificationFindReceiverFromNotificationProcess.OverriddenValidations = OverriddenValidations;
                try {
                    notificationFindReceiverFromNotificationProcess.StartProcessing();
                    Outputs.Validations.AddRange( notificationFindReceiverFromNotificationProcess.Outputs.Validations );
                }
                catch ( ValidationResultException validationResultException ) {
                    Outputs.Validations.AddRange( validationResultException.Validations );
                    if ( validationResultException.ContainsError() ) {
                        throw new ValidationResultException( string.Format( "Processing {0} resulted in an error", Name ), Outputs.Validations );
                    }
                }

                #endregion
                var NotificationFindReceiverFromNotificationResult = notificationFindReceiverFromNotificationProcess;
                Debugging.DebugWorker.Current.SetVariableValue( "NotificationFindReceiverFromNotificationResult", NotificationFindReceiverFromNotificationResult );

                // ShapeComment:[Assign Notification as Read][b60bbb93-3a06-4a57-ace3-6024f91c94a0][324e353c-cdd6-488e-8c9c-3420051a06f5]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "324e353c-cdd6-488e-8c9c-3420051a06f5" );
                Inputs.CurrentNotification.AdoptedBy = Inputs.CurrentUser;
                Inputs.CurrentNotification.ApprovalStatus = NotificationApprovalStatus.Approved;

                // ShapeComment:[Save Notification][b60bbb93-3a06-4a57-ace3-6024f91c94a0][c407dd77-b074-4c26-ac9b-557d73fec312]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "c407dd77-b074-4c26-ac9b-557d73fec312" );
                GoldMine.View.Notification.Home.Process.SaveNotificationProcess SaveNotificationProcessResult = null;
                try {
                    SaveNotificationProcessResult = ( GoldMine.View.Notification.Home.Process.SaveNotificationProcess ) EventProcess.ExecuteUnregisteredViewEvent( "GoldMine.View.Notification.Home.Process.SaveNotificationProcess", Inputs.CurrentUser, new NameValuePairInputCollection {
                        { "Notification", Inputs.CurrentNotification }
                    } );
                    Outputs.Validations.AddRange( SaveNotificationProcessResult.Outputs.Validations );
                }
                catch ( ValidationResultException validationResultException ) {
                    Outputs.Validations.AddRange( validationResultException.Validations );
                    if ( validationResultException.ContainsError() ) {
                        throw new ValidationResultException( string.Format( "Processing {0} resulted in an error", Name ), Outputs.Validations );
                    }
                }
                var HomeSaveNotificationResult = SaveNotificationProcessResult;
                Debugging.DebugWorker.Current.SetVariableValue( "HomeSaveNotificationResult", HomeSaveNotificationResult );
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "85d667f2-7ed7-4d91-9dff-1c25687fa197" );
                Debugging.DebugWorker.Current.EndProcess();
                Outputs.SessionToken = UiStringConverter.CreateSessionToken( Inputs.CurrentUser );
                return this;
            }
            *catch ( ConcurrencyException ) {
                throw;*
            }
EN

回答 1

Stack Overflow用户

发布于 2018-12-11 19:58:27

请注意异常消息中的这一点:

影响了意外的行数(0)

这基本上意味着“我以为我要改变什么,但我最终什么也没改变”。

这可以在像UPDATE MyTable SET MyColumn = "hi" WHERE Id = 5这样的查询中实现,但是在Id of 5中没有记录。

如果在这两行之一上抛出异常:

代码语言:javascript
复制
Inputs.CurrentNotification.AdoptedBy = Inputs.CurrentUser;
Inputs.CurrentNotification.ApprovalStatus = NotificationApprovalStatus.Approved;

这意味着这些属性的setter方法正在写入数据库。属性定义如下所示:

代码语言:javascript
复制
User AdoptedBy {
    get {
         //something here
    }
    set {
        //this is writing to the database
    }
}

出于某种原因,它正在更新一些不存在的东西。但我们不能告诉你为什么或者如何解决它而不看到代码。

因此,它取决于对任何类型的Inputs.CurrentNotification的类定义。如果它是您的类之一,那么您可能只需要调试并逐步完成该代码。

实际上,在属性getter/getter中执行任何类型的I/O操作都不是一个好主意。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53729982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档