معاملة قاعدة البيانات ترتكب جزئيًا فقط
-
22-09-2019 - |
سؤال
لقد حصلت على إجراء مخزن T-SQL يعمل على خادم قاعدة بيانات Sybase ASE والذي يفشل في بعض الأحيان في ارتكاب جميع عملياته ، على الرغم من أنه يكمل دون استثناء. إليك مثال تقريبي لما يفعله.
BEGIN TRANSACTION
UPDATE TABLE1
SET FIELD1 = @NEW_VALUE1
WHERE KEY1 = @KEY_VALUE1
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 1
END
UPDATE TABLE2
SET FIELD2 = @NEW_VALUE2
WHERE KEY2 = @KEY_VALUE2
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 2
END
INSERT TABLE2 (FIELD2, FIELD3)
VALUES (@NEW_VALUE3a, @NEW_VALUE3b)
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 3
END
COMMIT TRANSACTION
RETURN 0
يسمى الإجراء مئات المرات على الأقل في اليوم. في نسبة صغيرة من تلك الحالات (ربما <3 ٪) ، فقط INSERT
البيان يرتكب. Proc يكمل ويعود 0 ، ولكن الاثنين UPDATE
لا تأخذ. في الأصل اعتقدنا أنه قد يكون WHERE
بنود على UPDATE
لم يكن مطابقة أي شيء ، لذلك أضفنا IF @@rowcount
منطق. ولكن حتى مع هذه الشيكات هناك ، INSERT
لا يزال يحدث وما زال الإجراء يكمل ويعود 0.
أنا أبحث عن أفكار حول ما قد يسبب هذا النوع من المشكلات. هل هناك أي شيء عن الطريقة التي تعمل بها معاملات SQL ، أو الطريقة التي يعمل بها Sybase على وجه التحديد ، والتي يمكن أن تسبب COMMIT
لا ترتكب كل شيء؟ هل هناك شيء عن بلدي IF
الكتل التي يمكن أن تسمح للتحديث بعدم مطابقة أي شيء سوى الإجراء للاستمرار؟ أي أفكار أخرى؟
المحلول
هل من الممكن تحديثها ، لكن هناك شيء يغير القيم؟ حاول إضافة مشغل تحديث على تلك الجداول وداخل هذه الزناد إدراج في جدول سجل. بالنسبة للصفوف التي يبدو أنها لم يتم تحديثها في السجل ، هل هناك صف أم لا؟
نصائح أخرى
لا تعرف كيف تقوم بتعيين القيم لمتغيراتك ، يحدث لي أنه إذا كانت قيمة @new_value1 هي نفس القيمة السابقة في الحقل 1 ، فستنجح التحديث ويبدو أنه لم يغير أي شيء يجعلك تعتقد أن المعاملة كانت لها المعاملة لم يحدث.
يمكن أن يكون لديك أيضًا تشغيل يؤثر على التحديث.