لقد تعلمت مؤخرًا اختبار MyBatis ، ولم تكن هناك مشكلة في إضافة وحذف وتعديل وفحص وحده. أخيرًا ، وجدت العديد من المشكلات عند استخدام اختبار MVN:
1. فشل التحديث لأن قاعدة البيانات مسدودة
2. حدد الانتظار ، نظرًا لاستخدام تجمع التوصيل ويحتاج إلى الانتظار
يحصل:
1. كن شجاعًا لاستكشافها ، والمثابرة هي النصر. عندما رأيت الخطأ لأول مرة ، كنت في حيرة من أمري لأنني لم أستطع رؤية الخطأ على الإطلاق. كان خطأ تم الإبلاغ عنه في الإطار. كنت أتردد فيما إذا كنت أنام مباشرة
أشعر بذلك ، بعد كل شيء ، الساعة 12 تقريبًا. أخيرًا ، وجدت المشكلة قليلاً.
2. كما هو مذكور أعلاه ، يجب أن تجرؤ على البحث في الرموز التي لا تفهمها وتجرؤ على دراسة الرموز التي لا تفهمها.
3. أن تصبح أبعد وأبعد عن المبرمج المؤهل ، لأنه كلما تعلمت ، كلما شعرت بالثغرات ، ورمزك مليء بالمخاطر. لذلك ، تأكد من تسجيله.
السجلات التالية لهاتين المسألين.
1. deadlocl
هنا ، بفضل http://www.cnblogs.com/lin-xuan/p/5280614.html ، وجدت الإجابة. هنا ، سوف أعيد إنشائها:
Deadlock قاعدة البيانات هي مشكلة شائعة تواجهها قواعد بيانات المعاملات (مثل SQL Server ، MySQL ، إلخ). ما لم تحدث مشكلة قتلة قاعدة البيانات بشكل متكرر ولا يمكن للمستخدم تشغيلها ، فإن مشكلة قاعدة البيانات القاتلة ليست خطيرة بشكل عام. مجرد تجربة في التطبيق. فكيف يحدث deadlock البيانات؟
يقوم InNODB بتنفيذ أقفال مستوى الصف ، والتي يتم تقسيمها إلى أقفال (ق) وأقفال Mutex (X).
• يتم استخدام القفل المشترك لخط قراءة المعاملات.
• يتم استخدام Mutex لتحديث المعاملات أو حذف سطر واحد.
عندما يحمل العميل A القفل المشترك ويطلب Mutex X ؛ في الوقت نفسه ، يحتفظ Client B بـ Mutex X ويطلب القفل المشترك S. في الموقف أعلاه ، وسوف يحدث Deadlock قاعدة بيانات. إذا لم يكن الأمر واضحًا بما فيه الكفاية ، فيرجى الاطلاع على المثال أدناه.
فتح مزدوج اثنين من عملاء MySQL
العميل أ:
قم بتشغيل المعاملة وقفل القفل المشترك عندما يكون المعرف = 12:
mysql> ابدأ المعاملة ؛ استعلام موافق ، 0 صفوف تتأثر (0.00 ثانية) mysql> حدد * من المدونة حيث معرف = 12 قفل وضع المشاركة ؛+----+-------+-----------+| معرف | الاسم | uptor_id |+----+-------+-----------+| 12 | testa | 50 |+----+-------+-----------+صف واحد في المجموعة (0.00 ثانية)
العميل ب:
ابدأ الصفقة وحاول حذف المعرف = 12:
mysql> ابدأ المعاملة ؛ استعلام موافق ، 0 صفوف تتأثر (0.00 ثانية) mysql> حذف من المدونة حيث معرف = 12 ؛
تتطلب عملية الحذف mutex (x) ، لكن Mutex X والقفل المشترك غير متوافقين. لذلك ، يتم وضع معاملة الحذف في قائمة انتظار طلب القفل ، ويتم حظر العميل B.
في هذا الوقت ، يريد العميل أ أيضًا حذف 12:
mysql> حذف من المدونة حيث معرف = 12 ؛ استعلام موافق ، صف واحد متأثر (0.00 ثانية)
على عكس المقالة المرجعية ، كان الحذف ناجحًا ، لكن العميل B كان لديه خطأ:
خطأ 1213 (40001): تم العثور على Deadlock عند محاولة الحصول على القفل ؛ حاول إعادة تشغيل المعاملة
لذلك ، حاولت حذف 13 ، وكل ذلك محظور:
في رمز اختبار MyBatis الخاص بي ، نظرًا لأن الاختبار السابق لم يكن قد ارتكب ، فقد تسبب في طريق مسدود ، وكان على ما يرام بعد الالتزام. هنا ، أود أن أقول إن قاعدة البيانات قد تم إرجاعها إلى المعلم ، ويجب مراجعة الأقفال والمعاملات مرة أخرى.
2. عدد اتصالات قاعدة البيانات إلى مصدر البيانات في MyBatis
عندما أقوم باختبار MVN ، وجدت سجل طباعة اختبار الاستعلام:
2016-07-21 23: 43: 53،356 Debug [org.apache.ibatis.transaction.jdbc.jdbctransaction]-فتح JDBC
2016-07-21 23: 43: 53،356 Debug [org.apache.ibatis.datasource.pooled.pooledDataSource]-انتظار ما يصل إلى 20000 مليون ثانية للاتصال.
لذلك ، بعد الانتظار لفترة من الوقت ، كان الإعدام ناجحًا. تتبع رمز المصدر وابحث عن هذا السجل لفهمه. بادئ ذي بدء ، تكوين اتصال قاعدة البيانات الذي أستخدمه هنا هو MyBatis الافتراضي:
<البيئة معرف = "Development"> <TransactionManager type = "jdbc"/> <dataSource type = "prouded"> <property name = "driver" value = "$ {jdbc.driver}"/> <property name = "url" value = "$ {jdbc.url} name = "password" value = "$ {jdbc.password}"/> <property name = "password" value = "$ {jdbc.password}"/> <dataSource> </ (! (state.activeConnections.size () <poolmaximumactiveConnections) {// يمكن إنشاء اتصال جديد = bootedConnection (dataSource.getConnection () ، هذا) ؛ if (log.isdebugenabled () ConnectionPooledConnection assactActiveConnection = state.activeconnections.get (0) ؛ Long ExcheckoutTime = adgestActiveConnection.getCheckoutTime () longestcheckouttime ؛ state.activeConnections.remove (adsactiveConnection) ؛ if (! assactiveConnection.getRealConnection (). } conn = new pooledConnection (assactActiveConnection.getRealConnection () ، هذا) ؛ adgestActivEconnection.invalidate () ؛ if (log.isdebugenabled ()) {state.hadtowaitcount ++ ؛ countedWait = true ؛} if (log.isdebugenabled ()) {log.debug ("الانتظار طالما" +pooltimetowait +"millionseconds للاتصال.") ؛ System.CurrentTimEmillis () - wt ؛} catch (interruptedException e) {break ؛}}}}} if (conn! = null) {if (conn.isvalid ()) {if (! conn.getRealConnection (). getautocommit ())) {conn.getRealConnection (). Rollback () ؛} conn.setConnectionTyPecode (AssembleConnectionTypecode (datasource.geturl () ، اسم المستخدم ، كلمة مرور)) {log.debug ("تم إرجاع اتصال سيء ("+conn.getRealHashCode ()+") من التجمع ، الحصول على اتصال آخر.") ؛} {log.debug ("pooledDataSource: لا يمكن الحصول على اتصال جيد بقاعدة البيانات.") ؛}}}}}}عندما يكون عدد الاتصالات أقل من 10 ، سوف ينتظر أكثر من 10 اتصالات ، وإلا سيتم الإبلاغ عن خطأ.
ما سبق هو قاعدة بيانات MyBatis Update Deadlock للحصول على تجمع اتصال قاعدة البيانات في انتظار. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!