درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من
    اطلاعات مطلب
      مدرس/نویسنده
      حسین احمدی
      امتیاز: 464785
      رتبه:3
      340
      253
      402
      2670
      حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر
      دوره های مرتبط
      دوره های توسینسو دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 17 قسط خریداری کنید
      با خرید این دوره مبلغ 5,445 تومان هدیه بگیرید
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 17 قسط خریداری کنید
      با خرید این دوره مبلغ 8,470 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      مدرس: ایمان جوادی
      این دوره را در 13 قسط خریداری کنید
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      مدرس: مهدی عادلی فر
      این دوره را در 2 قسط خریداری کنید
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      مدرس: امیر حسین فضلیخانی
      این دوره را در 12 قسط خریداری کنید
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 27 قسط خریداری کنید
      با خرید این دوره مبلغ 8,110 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
      دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 23 قسط خریداری کنید
      با خرید این دوره مبلغ 7,425 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 78 قسط خریداری کنید
      با خرید این دوره مبلغ 82,245 تومان هدیه بگیرید
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      مدرس: کاظم تقندیکی
      این دوره را در 20 قسط خریداری کنید
      با خرید این دوره مبلغ 7,040 تومان هدیه بگیرید
      دوره آموزشی ساخت ربات تلگرام
      دوره آموزشی ساخت ربات تلگرام
      مدرس: کاظم تقندیکی
      این دوره را در 8 قسط خریداری کنید
      دوره آموزشی طراحی رابط کاربری با JavaFX
      دوره آموزشی طراحی رابط کاربری با JavaFX
      مدرس: حسام رسولیان
      این دوره را در 13 قسط خریداری کنید
      دوره آموزشی Exploit نویسی به زبان Perl
      دوره آموزشی Exploit نویسی به زبان Perl
      مدرس: ایمان جوادی
      این دوره را در 7 قسط خریداری کنید
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      مدرس: کاظم تقندیکی
      این دوره را در 11 قسط خریداری کنید

      مشکل Concurrency در SQL Server و مدیریت آن در Entity Framework

      تاریخ 13 ماه قبل
      نظرات 0
      بازدیدها 234
      یکی از مشکلاتی که در محیط هایی که چندین کاربر به صورت همزمان از یک بانک اطلاعاتی مشترک استفاده می کنند، مشکل Concurrency است. این مشکل زمانی پیش می آید که دو کاربر به صورت همزمان قصد ایجاد تغییر در یک رکورد را داشته باشند، فرض کنید کاربر 1 رکورد شماره 4 را برای تغییر از بانک اطلاعاتی خوانده است، در همین زمان که کاربر 1 در حال تغییر رکورد ها بوده و تغییرات هنوز در بانک اطلاعاتی ثبت نشده اند، کاربر 2 همان رکورد را می خواند، کاربر 1 تغییرات را ذخیره می کند و سپس کاربر 2 تغییرات را ذخیره می کند. در این حالت اطلاعات کاربری که آخرین به روزرسانی را در بانک ثبت می کند به عنوان اطلاعات اصلی در بانک ثبت می شود. در حالت عادی این موضوع مشکلی ایجاد نمی کند، اما اگر نوشتن اطلاعات توسط کاربرها اولویت داشته باشد باید برای رفع این مشکل کاری کرد. برای مدیریت Concurrency ها در Entity Framework در مدلی که قصد مدیریت Concurrency را برای آن داریم باید یک خصوصیت تعریف کرده و آن خصوصیت را به عنوان خصوصیتی که جهت جلوگیری از Concurrency استفاده می شود مشخص کنیم. مدل زیر را در نظر بگیرید:

      public class Customer
      {
          public int Id { get; set; }
          public string FirstName { get; set; }
          public string LastName { get; set; }
      }
      
      public class SampleContext : DbContext
      {
          public DbSet<Customer> Customers { get; set; }
      }
      

      در حالت عادی اگر کد زیر را اجرا کنیم مشکلی ایجاد نخواهد شد:

      var context1 = new SampleContext();
      var context2 = new SampleContext();
      
      var customer1 = context1.Customers.First();
      var customer2 = context2.Customers.First();
      
      customer1.FirstName = "Mohammad";
      customer2.FirstName = "Reza";
      
      context1.SaveChanges();
      context2.SaveChanges();
      

      در کد بالا در دو Context جداگانه رکوردی از جدول Customers خوانده شده و خصوصیت FirstName آن تغییر داده می شود، در کد بالا با فراخوانی متد SaveChanges هیچ مشکلی ایجاد نشده و نام Reza به عنوان نام نهایی در جدول ثبت می شود. در این حالت Concurrency رخ داده است. برای مدیریت این حالت، کلاس Customers را به صورت زیر تغییر می دهیم:

      public class Customer
      {
          public int Id { get; set; }
          public string FirstName { get; set; }
          public string LastName { get; set; }
          [Timestamp]
          public byte[] RowVersion { get; set; }
      }
      

      خصوصیت RowVersion که در کد بالا مشاهده می کنید، بعد از ایجاد بانک اطلاعاتی ستونی از نوع timestamp در جدول ایجاد خواهد کرد و از این ستون برای مدیریت Concurrency استفاده می شود، با هر بار خواندن رکورد از جدول مقدار RowVersion تغییر می کند و زمان به روز رسانی از این ستون برای مقایسه بین نسخه Entity و نسخه بانک اطلاعاتی استفاده شده و در صورت وجود تفاوت میان مقادیر بانک اطلاعاتی و RowVersion خطایی از نوع DbUpdateConcurrencyException ایجاد خواهد شد. بعد از اضافه کردن خصوصیت RowVersion کد به روزرسانی اطلاعات رو به صورت زیر تغییر می دهیم:

      var context1 = new SampleContext();
      var context2 = new SampleContext();
      
      var customer1 = context1.Customers.First();
      var customer2 = context2.Customers.First();
      
      customer1.FirstName = "Mohammad";            
      customer2.FirstName = "Reza";
      
      
      try
      {
          context1.SaveChanges();
      }
      catch (DbUpdateConcurrencyException ex)
      {
          throw;
      }                       
      
      try
      {
          context2.SaveChanges();
      }
      catch (DbUpdateConcurrencyException ex)
      {
          throw;
      }
      

      با اجرای کد بالا پیغام خطایی به صورت زیر دریافت می کنیم:

      مدیریت Concurrency در Entity Framework


      همچنین اگر دستورات SQL اجرا شده توسط Entity Framework را بررسی کنیم، خواهیم دید که در زمان اجرای دستورات update ستون RowVersion نیز به در قسمت where استفاده شده است:

      UPDATE [dbo].[Customers]
      SET [FirstName] = @0
      WHERE (([Id] = @1) AND ([RowVersion] = @2))
      

      زمان وقوع خطا شما می توان در بخش catch عملیات مورد نظر خود را انجام دهید، برای مثال، رکورد را مجدد بخوانید و Update را انجام دهید یا مقدار جاری را نگه داری کنید که این موضوع بستگی به نحوه پیاده سازی سیستم خواهد داشت. علاوه بر ستون RowVersion می توان ستون های دیگری را نیز به عنوان ستونی که برای بررسی Concurrency استفاده می شود انتخاب کرد، برای مثال، در مدل زیر ستون FirstName به عنوان ستون Concurrency Check انتخاب شده است:

      public class Customer
      {
          public int Id { get; set; }
          [ConcurrencyCheck]
          public string FirstName { get; set; }
          public string LastName { get; set; }
          [Timestamp]
          public byte[] RowVersion { get; set; }
      }
      

      دستور SQL ایجاد شده در حالت بالا به صورت زیر خواهد بود:

      UPDATE [dbo].[Customers]
      SET [FirstName] = @0
      WHERE ((([Id] = @1) AND ([FirstName] = @2)) AND ([RowVersion] = @3))
      

      به این نکته دقت کنید که در زمان تعریف Entity ها، برای هر Entity تنها یک ستون Timestamp می توان تعریف کرد، اما چندین ستون رو می توان با ConcurrencyCheck مشخص کرد.

      نویسنده: حسین احمدی
      منبع: ITpro
      برچسب ها
      مطالب مرتبط

      در حال دریافت اطلاعات

      نظرات
      هیچ نظری ارسال نشده است

        برای ارسال نظر ابتدا به سایت وارد شوید

        arrow