Jdbi: المشكلة عندما يكون الالتزام التلقائي خطأً.

تم إنشاؤها على ١٥ مارس ٢٠١٨  ·  4تعليقات  ·  مصدر: jdbi/jdbi

باستخدام JDBI 3.1.0.
عند استخدام autocommit = false ، سيفشل JDBI في فتح معاملة ، وسوف يطرح استثناء يقول أن المعاملة مفتوحة بالفعل.

من خلال ما قمت بتصحيحه ، يبدو أن المشكلة موجودة في فئة LocalTransactionHandler.

public boolean isInTransaction(Handle handle)
     {
            return !handle.getConnection().getAutoCommit();
    }

 public <R, X extends Exception> R inTransaction(Handle handle,
                                                    HandleCallback<R, X> callback) throws X
   if (isInTransaction(handle)) {
            throw new IllegalStateException("Already in transaction");
   }

يحدث هذا الأمر إذا كان الالتزام التلقائي صحيحًا.

هل هناك أي طريقة يمكنني من خلالها مساعدتك في هذه المشكلة؟

شكرا

question

التعليق الأكثر فائدة

شكرا لك على وقتك!

أقدم وثائق العلاقات العامة في نهاية هذا الأسبوع.

ال 4 كومينتر

هذه خاصية خاصة لـ JDBC: إذا قمت بتعيين الالتزام الآلي على خطأ ، فإن عملية قاعدة البيانات التالية ستبدأ ضمنيًا المعاملة.

https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

إذا كنت تستخدم طرق Jdbi لإدارة المعاملات ، يتوقع Jdbi أن يكون الحكم على خاصية الالتزام التلقائي هذه. وإلا ، فليس لدينا طريقة لمعرفة ما إذا كنت تدير الالتزام التلقائي يدويًا أم لا ، مقابل استخدام طرق البدء () / الالتزام () / التراجع () بشكل غير صحيح.

لدينا مشكلة مفتوحة لمحاولة استخدام نقاط الحفظ للسماح بـ "المعاملات الفرعية". انظر # 937

على الرغم من أنه ليس لدي أي مشكلة في استخدام الالتزام التلقائي = صحيح ، فإن هذا السلوك غريب ، لأن المطور قد يستدعي start () / الالتزام () / rollback () بشكل غير صحيح على أي حال.

مشكلتي الرئيسية هي أن السلوك غير موثق ، لقد فهمته فقط من خلال تصحيحه. كما أنني كنت أقوم بترحيل تطبيق من وضع السبات إلى JDBI ، وفي عالم السبات يوصون باستخدام الالتزام التلقائي = خطأ.

أيضًا ، من وجهة نظر API ، ألن يكون من المربك استخدام "المعاملات الفرعية". ضمنيًا وليس صريحًا؟

على الرغم من أنه ليس لدي أي مشكلة في استخدام الالتزام التلقائي = صحيح ، فإن هذا السلوك غريب ، لأن المطور قد يستدعي start () / الالتزام () / rollback () بشكل غير صحيح على أي حال.

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

مشكلتي الرئيسية هي أن السلوك غير موثق ، لقد فهمته فقط من خلال تصحيحه.

هذا عادل. لقد بذلنا الكثير من العمل لتحسين التوثيق في إصدار v3 ، ولكن من الواضح أن هناك مجالًا للتحسين.

إذا كنت ترغب في تقديم طلب سحب مع الوثائق التي ترغب في وجودها ، فسيكون ذلك مفيدًا للغاية. نحاول أن نكون دقيقين ، ولكن عندما تكون في الكود لفترة من الوقت ، قد يكون من الصعب رؤية الطريقة التي يبدو عليها للوافدين الجدد.

كما أنني كنت أقوم بترحيل تطبيق من وضع السبات إلى JDBI ، وفي عالم السبات يوصون باستخدام الالتزام التلقائي = خطأ.

أوافق على أن إعداد auto-commit=false هو أفضل ممارسة لمشروعات Hibernate / JPA. سبب رغبتك في تعيينه مع Hibernate هو أن جميع السجلات التي تم استردادها في جلسة ما تأتي من نفس حالة قاعدة البيانات.

Jdbi لا تستخدم الجلسات - نحن نستخدم معاملات قاعدة البيانات مباشرة. مع Jdbi ، يمكنك قراءة البيانات الحية ، أو استخدام معاملة حتى تأتي القراءات المتتالية من حالة قاعدة بيانات متسقة - وفقًا لتقديرك. يمكنك أيضًا تنفيذ عدة معاملات مستقلة على نفس الاتصال إذا كانت حالة الاستخدام الخاصة بك تستدعي ذلك. لذا فإن التوصية auto-commit=false هي إلى حد ما مفارقة تاريخية في Jdbi.

أيضًا ، من وجهة نظر API ، ألن يكون من المربك استخدام "المعاملات الفرعية". ضمنيًا وليس صريحًا؟

تدعم بعض برامج تشغيل JDBC مفهوم "نقاط حفظ" (تسمى بدلاً من ذلك "نقاط التفتيش") في المعاملات. من خلال تعيين المعاملات المتداخلة إلى نقاط التوقف هذه ، سيوفر طريقة للالتزام أو التراجع عن مجموعة فرعية من العمليات بشكل ذري دون الحاجة إلى الالتزام أو التراجع عن المعاملة ككل.

أفترض أنه يمكننا توفير inSavepoint(String name, TransactionCallback) والذي سينشئ تلقائيًا النقطة المحفوظة ، وإما الإصدار (المكافئ للالتزام) أو التراجع عن النقطة المحفوظة بناءً على ما إذا كان رد الاتصال قد طرح استثناءً.

شكرا لك على وقتك!

أقدم وثائق العلاقات العامة في نهاية هذا الأسبوع.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

stevenschlansker picture stevenschlansker  ·  4تعليقات

keith-miller picture keith-miller  ·  3تعليقات

raderio picture raderio  ·  6تعليقات

agavrilov76 picture agavrilov76  ·  5تعليقات

Romqa picture Romqa  ·  5تعليقات