• 0
Hisham_wz

منع مستخدم اخر من تشغيل stored procedure حتي ينتهي المستخدم الاول

سؤال

السلام عليكم

 

لدي قاعدة بيانات يستخدمها عدة مستخدمين في نفس الوقت؛ ولدي stored procedure يقوم بتنفيذ عدة عمليات داخل قاعدة البيانات.

أريد منع اي مستخدم من تشغيل الـ stored procedure أثناء تشغيله من قبل مستخدم أخر؟

أو حتي يعطل طلب المستخدم الثاني حتي يقوم المستخدم الاول من الانتهاء من الخطوات الموجودة داخل الـ stored procedure مدام قد التشغيل.

 

شكرا مقدما

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

10 إجابة على هذا السؤال .

  • 2

وعليكم السلام

 

استخدم transaction

استخدام ذلك يختلف من محرك قواعد بيانات إلى آخر sql server ,oracle , mysql

والمبدأ واحد

 

مثال على sql server

BEGIN TRANSACTION 
INSERT INTO TestTrans VALUES (@PriKey, @CharCol)
INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol)
COMMIT 

 

تم تعديل بواسطه أحمد أبو عبد البر
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

السلام عليكم ورحمة الله وبركاته

 transaction تقوم بعمل تكتب كل الخطوات في ملف اللوج ثم مره واحد تنفذه علي قاعدة البيانات بشرط تمام كل العمليات من جلال امر COMMIT واذا حدث خطا في اخد المراحل يتراجع عن الكل من خلا امر Rollback وبهذا يقوم قائمة من طلبات المستخدمين لل stored procedure للاول قي الطلب ثم الثاني بعد الانهاء ولكن يفضل ان يكون stored procedure سريع

انظر الرابط

http://www.c-sharpcorner.com/UploadFile/63f5c2/commit-and-rollback-comands-in-sql-server/

تم تعديل بواسطه KARIMSOFT
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

@KARIMSOFT

هل منعي ذلك :

أن استخدام الـ transaction في تنفيذ مجموعة اوامر بدلا من الـ stored procedure سوف يبطي من سرعة استجابة قاعدة البيانات؟

اما ان التاخير سوف يكون اجزاء من الثانية او ثواني علي اقصي تقدير؟

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته

اولا  transactionتككتب داخل الstored procedure

ثانيا اقصد بالبطء هو بطء شكل الجمل المستخدمة مثل count(*) بطيئه جدد ولكن count(1) اسعر بكثير وهذا هناك جمل اسرع من جمل هذا ما اقصده

بالتوفيق

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا للاساتذة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

@Hisham_wz اذا حصلت على جواب مناسب من الاجابات اعلاه٫ ارجو تحديد الجواب الانسب.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا شكر علي واجب ونحن هنا كلنا طلاب رحمة الله بعلم ينفع الناس وكلنا طلاب علم

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم و رحمة الله

مع احترامي لجميع الذين أجابوا على السؤال لكني أظن أن هناك حلقة مفقودة في الإجابات, و هي أن وجود الـ Transaction لا يمنع بقية المستخدمين من استدعاء الإجراء أو من الوصول إلى الجداول التي يتعامل معها الإجراء المخزن ما لم يكن مستوى عزل الـ Transaction محدد كـ Serializable و هي أقوى حالات العزل و تماثل استدعاء Select  مع الخيار HOLDLOCK.

Create Proc TestProc
AS

SET TRANSACTION ISOLATION LEVEL Serializable
Begin Tran

-- You SQL Statements Here

Commit Tran

Go

تحياتي للجميع

تم تعديل بواسطه imadouzoun
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
3 ساعه مضت , imadouzoun said:

السلام عليكم و رحمة الله

مع احترامي لجميع الذين أجابوا على السؤال لكني أظن أن هناك حلقة مفقودة في الإجابات, و هي أن وجود الـ Transaction لا يمنع بقية المستخدمين من استدعاء الإجراء أو من الوصول إلى الجداول التي يتعامل معها الإجراء المخزن ما لم يكن مستوى عزل الـ Transaction محدد كـ Serializable و هي أقوى حالات العزل و تماثل استدعاء Select  مع الخيار HOLDLOCK.


Create Proc TestProc
AS

SET TRANSACTION ISOLATION LEVEL Serializable
Begin Tran

-- You SQL Statements Here

Commit Tran

Go

تحياتي للجميع

ممكن تشرح أكتر عن الموضوع اللي انت بتقوله ده ؟

أنا عندي مشكلة في جملة select أثنا مستخدم أخر عامل Transaction  على نفس الجدول 

بمعني إن هناك مستخدم رقم 1 يقوم بعملية Insert في الجدول X مع وجود Transaction في عملية الـ Insert

وهناك مستخدم أخر رقم 2 يقوم بعملية Select من الجدول X   بدون Transaction طبعا

تظهر للمستخدم رقم 2 الرسالة المشهورة

Transaction (Process ID 72) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

هل هناك حل بحيث المستخدم رقم 2 لا يتأثر بالـ Transaction بتاعة المستخدمين التانيين ؟؟

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم أخي الكريم

يمكنك التغلب على هذه المشكلة عن طريق تنفيذ المستخدم الثاني للعبارة التالية قبل استدعاء الـ Select Query:
 

Set Transaction Isolation Level Read Uncommitted

Select * from X

و هنا سيقرأ المستخدم الثاني ما يسمى بالـ Dirty Data و المقصود أن ما سيقرأه المستخدم الثاني قد يتم التراجع عنه عن طريق الـ Rollback التي ربما يستدعيها المستخدم الأول.

 

و اذا اردت أعمل المثال التالي لتبسيط الشرح:

أنشأ جدولا سمه  X:

Create Table X(id int)

أضف بيانات عبثية:

Insert T select 1 union select 2 union select 3

الآن دع المستخدم الأول ينفذ التالي:

begin tran

Insert T select 10000

الآن دع المستخدم الثاني ينفذ التالي:

Set Transaction Isolation Level Read Uncommitted
Select * from T

ثم اجعل المستخدم الأول يتراجع عن المناقلة:

rollback Tran

و كل الذي سبق يمكنك تنفيذه في الـ SQL Server Management Studio

 

أتمنى أن أكون قد أجبتك أخي الكريم.

تحياتي

 

 

Capture.PNG

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .