سؤال

ويمكنني استخدام JMeter لاختبار تطبيق الويب الخاص بي. وحالتي الاختبار لإضافة سجل في قاعدة البيانات. وبعد ذلك تعيين "عدد من المستخدمين موضوع" إلى 20، فهذا يعني أنه سوف محاكاة 20 المستخدمين العمل في نفس الوقت. وبعد ذلك تشغيل حالة اختبار. ولكن في النهاية وجدت فإن النظام لا تخلق 20 السجلات في قاعدة البيانات، ولكن بدلا من مجرد خلق 13 السجلات في قاعدة البيانات.

وأريد أن أعرف لماذا حدث هذا؟ هل من الممكن أن لفي تطبيق الويب الخاص بي لم أكن إضافة "متزامنة" أمام طريقة السجلات إضافة؟ كنت LINQ، إذا اثنين المستعمل نشر طلب لإنشاء سجل إلى خادم في الوقت نفسه، ما الذي سيحدث؟ مجرد إنشاء سجل أو يمكن إنشاء اثنين من السجلات، أو بنجاح المجهول؟

وفيما يلي نموذج التعليمات البرمجية لإنشاء سجل في قاعدة البيانات:

       public int SaveEventGroup(int id, Models.Entities.EventGroup e, Nullable<int> setpublish)
    {
        try
        {
            Entities.EventGroup db;
            if (id == 0)
            {
                db = new Entities.EventGroup();
                db.CreatedBy = e.CreatedBy;
                db.CreateDatetime = DateTime.Now;
                db.Status = true;
            }
            else
            {
                db = this.GetEventGroup(id);
            }

            db.NameCN = e.NameCN;
            db.NameEN = e.NameEN;
            db.NameZH = e.NameZH;
            db.NamePT = e.NamePT;
            db.DisplayOrder = GetGroupMaxDisplayOrder() + 1;

            if (setpublish == null)
            {
                db.PublishStatus = false;
                db.PublishDatetime = null;
                db.UpdateDatetime = DateTime.Now;
                db.UpdatedBy = e.UpdatedBy;
            }

            if (id == 0)
                dataContext.AddToEventGroupSet(db);

            dataContext.SaveChanges();

            return db.Id;
        }
        catch (Exception ex)
        {
            log.Error(ex.Message, ex);
            throw ex;
        }
    }
هل كانت مفيدة؟

المحلول

وينبغي أن تكون قاعدة البيانات نفسها متوافقة حامض، لذلك أشك في أن المسألة مع قاعدة البيانات عندما يتعلق الأمر التزامن. إذا قمت بإدراج رقما قياسيا جديدا ومرتبطا هذا السجل من قبل شيئا مثل عدد صحيح، تزايد السيارات، وقاعدة البيانات لن ستومب على ذلك إلا إذا كنت أقول لتحديث قبل أن الهوية، وبدلا من إدراج سجل جديد. ولكن منذ كنت لا كتابة SQL، الذي يعرف حقا ما كنت تعليمات قاعدة البيانات للقيام به.

وأنا أقترح إزالة LINQ من المعادلة، وكتابة هذا يدويا. ما تختبره يبدو أن بسيطة جدا "upsert" العملية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top