هل يمكنني الحصول على ORA-08177 إذا كان هناك اتصال واحد فقط إلى قاعدة البيانات؟

StackOverflow https://stackoverflow.com/questions/1002038

سؤال

ولقد تم تكليف مع تشغيل وحدة الاختبارات على الواجهة الخلفية العاصفة لأوراكل حتى نتمكن من معرفة ما إذا كانت الخلفية هي من نوعية كافية لاستخدامها في الإنتاج. مشكلة واحدة أن أنا على التوالي في غير أنني أتلقى ORA-08177 (لا يمكن إجراء تسلسل الوصول لهذه الصفقة) إذا كنت على اتصال في وضع قابل للتسلسل. المشكلة يذهب بعيدا عندما تستخدم وضع القراءة الملتزمين.

والآن لقد قرأت هذا نسأل توم المادة، وذلك يدل على أن هذا هو الأساس قضية التزامن.

وعلى افتراض أن أنا عندي فقط موضوع واحد يربط إلى قاعدة البيانات وليس لأحد آخر في العالم  يتم الاتصال إلى قاعدة البيانات هذه، هل من الممكن الحصول على هذا الخطأ؟ وإذا كان الأمر كذلك، هل يمكن لشخص تقدم لي مع استعلام المثال الذي من شأنه أن يولد هذا الخطأ؟

وأم أن هذا يدل المحتمل للمؤشر أو اتصال لم يتم مغلق في مكان ما؟ أو معاملة لا ترتكب أو التراجع؟

هل كانت مفيدة؟

المحلول

وقال "هناك <م> هي مشغلات المشاركة، ولكن أنا الحصول على أخطاء في البيانات DDL، وليس على تحديث أو إدراج".

يجب

والبيانات DDL التعامل الخاصة بهم بارتكاب. أساسا أنها لا على ارتكابها، ثم التغييرات الفوقية (والتي يمكن أن تنطوي على عدد من الأشياء الأساسية) ثم ارتكاب مرة أخرى (على افتراض DDL ينجح - إذا فشلت التغيير يجب التراجع).

وحتى إذا كنت تفعل DDL، يجب أن تكون آمنة على ارتكابها، وتغيير المعاملة لقراءة ملتزمة، لا في DDL، ثم تغيير المعاملة مرة أخرى إلى تسلسل. إذا كنت يمكن أن تعطي حالة اختبار كاملة (أو على الأقل هذا النوع من DDL الذي تتكلمون عنه) أنه قد يساعد. وخلق رأي تتحقق أو إنشاء الجدول AS SELECT، على سبيل المثال، قد يكون "غريبا" كما أنه سيكون DDL (مع ه غريبة ارتكاب)، بالإضافة إلى DML.

نصائح أخرى

وخلال جلسة واحدة فقط يجب أن لا تحصل على هذا الخطأ. البرنامج النصي التالي ولكن سوف تفرخ جلسة الثانوية التي سيتم تحديث صف واحد بشكل مستقل من الدورة الأولى، مما يسمح لنا لتحريك ORA-8177. أنا لست متأكدا إذا كان هذا هو ما تريد.

والنظر فيما يلي:

SQL> alter session set isolation_level=serializable;

Session altered
SQL> create table test (a number);

Table created
SQL> insert into test values (1);

1 row inserted
SQL> commit;

Commit complete
SQL> declare
  2     pragma autonomous_transaction;
  3  begin
  4     update test set a = 2;
  5     commit;
  6  end;
  7  /

PL/SQL procedure successfully completed
SQL> update test set a = 3;

update test set a = 3

ORA-08177: can't serialize access for this transaction
scroll top