سؤال

لقد حصلت على إجراء مخزن 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 ، فستنجح التحديث ويبدو أنه لم يغير أي شيء يجعلك تعتقد أن المعاملة كانت لها المعاملة لم يحدث.

يمكن أن يكون لديك أيضًا تشغيل يؤثر على التحديث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top