ورود

View Full Version : سوال: ایجاد رکورد توسط 2 کاربر در حالت BeginTrans؟



SYNDROME
شنبه 19 تیر 1389, 13:50 عصر
با سلام
در یک برنامه کاربران متعددی ورود اطلاعات می کنند.
فرض می کنیم Insert کردن هر رکورد با تابعی که بعد از آن اجرا می شود 30 ثانیه طول می کشد
دستور ذخیره هم به شکل زیر است


ADOConnection.BeginTrans;
ADO.Insert;
..
..
ADO.Post;
Call Function
ADOConnection.CommitTrans;

حالا کاربر اول اقدام به ذخیره یک رکورد می کند و کاربر دوم بعد از 1 ثانیه عمل فوق را نجام می دهد.
با Post شدن رکورد کاربر اول ، Post کاربر دوم تا Commit شدن ذخیره کاربر اول طول می کشد.
حالا فکر کنید اگر چند کاربر این عمل را انجام دهند چه فاجعه ای رخ می دهد.
برای این که چند کاربر بتوانند در یک لحظه عملیات ذخیره را انجام دهند چه کاربر باید انجام دهم؟؟؟؟
ممنون می شوم بنده را راهنمایی کنید.

vcldeveloper
شنبه 19 تیر 1389, 17:42 عصر
حالا فکر کنید اگر چند کاربر این عمل را انجام دهند چه فاجعه ای رخ می دهد.
خب، چه فاجعه ایی رخ میده؟! هر کدوم دارند رکورد جدیدی رو Insert می کنند. بانک اطلاعاتی تون میدونه چطور به درخواست های همزمان پاسخ بده.
در ضمن، مگه چیکار دارید می کنید که هر Insert در بانک 30 ثانیه طول میکشه؟

SYNDROME
شنبه 19 تیر 1389, 19:06 عصر
خب، چه فاجعه ایی رخ میده؟! هر کدوم دارند رکورد جدیدی رو Insert می کنند. بانک اطلاعاتی تون میدونه چطور به درخواست های همزمان پاسخ بده.
quote]
خوب علی آقا اگر Insert می کرد که مشکلی نبود.مشکل همین جاست که Insert نمی کنه.
تا کاربر اول Commit را انجام ندهد کاربران دیگر نمی توانند عمل Post را انجام دهند
و اگر 30 کاربر به طور همزمان اقدام به ذخیره اطاعات کنند به ترتیب باید عمل ذخیره را انجام دهند.
البته من برای تست این مورد بعد از دستور Post و قبل از Commit یک پیغام نمایش دادم که Commit اجرا نشود و دیدم هیچ کس نمی تواند عمل ذخیره را انجام دهد.
[quote=علی کشاورز;1037076]
در ضمن، مگه چیکار دارید می کنید که هر Insert در بانک 30 ثانیه طول میکشه؟
خوب من در بالا گفتم که فرض می کنیم.
می خواهم بدانم که چرا این اتفاق می افتد؟؟؟؟
من از ADOConnection و ADOQuery استفاده می کنم و به تنظیمات پیش فرض آنها هم دست نزده ام.
از بانک SQL Server 2005 هم استفاده می کنم.
با تشکر

vcldeveloper
شنبه 19 تیر 1389, 20:20 عصر
خوب علی آقا اگر Insert می کرد که مشکلی نبود.مشکل همین جاست که Insert نمی کنه.
تا کاربر اول Commit را انجام ندهد کاربران دیگر نمی توانند عمل Post را انجام دهند
این برمیگرده به SQL Server؛ این نرم افزار متناسب با نوع درخواست کاربر، و ساختار جداول، و رکوردهایی که تحت تاثیر اون درخواست قرار می گیرند؛ روی رکوردها قفل هایی ایجاد میکنه، برآیند این قفل ها تعیین میکنه که آیا امکان اجرای چند Transaction به طور همزمان روی یک داده خاص وجود داره یا نه.
در سمت دلفی، تنها کنترلی که شما می تونید روی نحوه اجرای Transactionها در یک Connection داشته باشید، از طریق خصوصیت IsolationLevel مربوط به AdoConnection هست.

این رو در تالار SQL Server مطرح کنید، تا دوستانی که از شرایط Lock کردن موجودیت ها در SQL Server اطلاع دارند، درباره آن توضیح بدند.