ما هو نطاق العزلة في المعاملات المتداخلة في SQL Server؟
-
03-07-2019 - |
سؤال
والنظر في SQL التالية:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ COMMITTED INSERT Bands ( Name ) SELECT 'Depeche Mode' UNION SELECT 'Arcade Fire' -- I've indented the inner transaction to make it clearer. BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM Bands COMMIT -- What is the isolation level right here? UPDATE Bands SET Name = 'Modest Mouse' WHERE Name = 'Oddest House' COMMIT
في المبلغ، ونحن نبدأ صفقة وتعيين مستوى عزلتها إلى READ COMMITTED
. نحن بعد ذلك القيام ببعض SQL عشوائي وتبدأ أخرى، والمعاملات المتداخلة. في هذه الصفقة نغير مستوى العزل إلى READ UNCOMMITTED
. ثم أننا ارتكاب تلك المعاملة والعودة إلى أخرى.
والآن، تخميني هو أنه بعد ارتكاب الداخلية، مستوى العزل يعود إلى READ COMMITTED
. فهل هذا صحيح؟
المحلول
وأنا لا أعتقد أن هذا هو الصحيح.
والرجوع إلى تصريحات هنا: تعيين عملية أ >
<اقتباس فقرة>واحد فقط من مستوى العزل يمكن تعيين الخيارات في وقت واحد، وذلك يبقى المحددة لهذا الشأن حتى يتم تغيير صراحة.
اقتباس فقرة>نصائح أخرى
وأنت [بوب بروبست] صحيحة. ومن المثير للاهتمام، وفقا لوثائق الذي المرتبط:
<اقتباس فقرة>إذا كنت لإصدار SET TRANSACTION عزل LEVEL في إجراء مخزن أو المشغل، عندما السيطرة على عوائد الكائن تتم إعادة تعيين مستوى العزل إلى مستوى سارية المفعول عندما تم استدعاء الكائن. على سبيل المثال، إذا قمت بتعيين READ للتكرار في دفعة ودفعة ثم باستدعاء إجراء مخزن الذي يحدد مستوى العزل إلى SERIALIZABLE، وتحديد مستوى العزل يعود إلى تكرار قراءة عند السيطرة على عوائد الإجراء المخزن إلى دفعة واحدة.
اقتباس فقرة>وهكذا، وخلاصة القول هنا هو أن LEVEL SET TRANSACTION عزل و<م> إجراء تقارب م>، وليس <م> تقارب الصفقة م> (كما كنت أظن).
ورائع!