هناك ثلاثة أنواع من معاملات Java: معاملة JDBC ، ومعاملة JTA (JAVA Transaction API) ، ومعاملة الحاوية. معاملات الحاوية الشائعة مثل معاملات الربيع. يتم توفير معاملات الحاويات بشكل أساسي بواسطة خوادم تطبيق J2EE. يتم الانتهاء من معظم معاملات الحاويات على أساس JTA. هذا هو تطبيق واجهة برمجة تطبيقات معقدة للغاية قائم على JNDI. لذلك ، لن تناقش هذه المقالة معاملات الحاويات في الوقت الحالي. تقدم هذه المقالة بشكل أساسي معاملتين أساسيتين نسبيًا في تطوير J2EE: معاملة JDBC ومعاملة JTA.
معاملات JDBC
تعتمد جميع السلوكيات ، بما في ذلك المعاملات ، من JDBC ، على اتصال ، ويتم إجراء إدارة المعاملات من خلال كائن الاتصال في JDBC. في JDBC ، الأساليب المتعلقة بالمعاملات الشائعة الاستخدام هي: setautocommit ، الالتزام ، التراجع ، إلخ.
فيما يلي رمز معاملة JDBC بسيط:
public void jdbctransfer () {java.sql.connection conn = null ؛ حاول {conn = conn = drivermanager.getConnection ("jdbc: oracle: thin: host: 1521: sid" ، "username" ، "userpwd") ؛ // قم بتعيين الالتزام التلقائي بـ FALSE ، // إذا تم تعيينه على TRUE ، فسوف تتعرف قاعدة البيانات على كل تحديث للبيانات كمعاملة ويقومون تلقائيًا بإرسال conn.setautocommit (false) ؛ stmt = conn.createstatement () ؛ // قلل المبلغ في الحساب A بمقدار 500 STMT.Execute ("/ تحديث T_Account Set المبلغ = المبلغ - 500 where account_id = 'a'") ؛ // قم بزيادة المبلغ في الحساب B بمقدار 500 STMT.Execute ("/ تحديث T_Account Set المبلغ = المبلغ + 500 حيث account_id = 'b'") ؛ // إرسال المعاملة conn.commit () ؛ // التزام المعاملات: تنجح عملية النقل المكونة من خطوتين في نفس الوقت} catch (sqlexception sqle) {try {// استثناء يحدث ، rollback () في هذه المعاملة conn.rollback () ؛ // تراجع المعاملات: عملية النقل المكونة من خطوتين تُلاحك بالكامل STMT.Close () ؛ conn.close () ؛ } catch (استثناء تجاهل) {} sqle.printstacktrace () ؛ }}ينفذ الرمز أعلاه وظيفة نقل بسيطة ، والتي تتحكم في عملية النقل من خلال المعاملات ، إما إرسال أو التراجع.
إيجابيات وسلبيات معاملات JDBC
يوفر JDBC الدعم الأساسي لعمليات معاملات قاعدة البيانات باستخدام Java. من خلال معاملات JDBC ، يمكننا وضع عبارات SQL متعددة في نفس المعاملة لضمان خصائصها الحمضية. الميزة الرئيسية لمعاملات JDBC هي أن واجهة برمجة التطبيقات بسيطة نسبيًا ، ويمكنها تنفيذ عمليات المعاملة الأساسية ، والأداء جيد نسبيًا.
ومع ذلك ، فإن معاملات JDBC لها قيود واحدة: لا يمكن أن تمتد معاملة JDBC على قواعد بيانات متعددة! ! ! لذلك ، إذا تم إشراك عمليات قاعدة بيانات متعددة أو سيناريوهات موزعة ، فإن معاملات JDBC عاجزة.
معاملات JTA
لماذا تلزم JTA
عادة ، يمكن لمعاملات JDBC حل المشكلات مثل اتساق البيانات. بالنظر إلى أن استخدامه بسيط نسبيًا ، فإن الكثير من الناس يعرفون فقط أن هناك معاملات JDBC حول المعاملات في Java ، أو أن بعض الناس يعرفون عن المعاملات في الأطر (مثل السبات ، الربيع) ، وما إلى ذلك. ومع ذلك ، لأن JDBC لا يمكنها تنفيذ المعاملات الموزعة ، وهناك المزيد والمزيد من السيناريوهات الموزعة.
إذا لم تواجه سيناريوهات لا يمكن حل معاملات JDBC في العمل ، فيمكنك فقط القول إن المشاريع التي تقوم بها لا تزال صغيرة جدًا. خذ مواقع التجارة الإلكترونية كمثال. نقوم عمومًا بتقسيم موقع التجارة الإلكترونية أفقياً إلى وحدات المنتج ، وحدات الطلب ، ووحدات عربة التسوق ، ووحدات الرسائل ، ووحدات الدفع ، وما إلى ذلك. ثم ننشر وحدات مختلفة على آلات مختلفة ، وتتواصل كل وحدة من خلال مكالمات الخدمة عن بُعد (RPCs) وطرق أخرى. تقديم الخدمات إلى العالم الخارجي مع نظام موزع.
يجب أن تتفاعل عملية الدفع مع وحدات متعددة ، يتم نشر كل وحدة في جهاز مختلف ، وتكون قواعد البيانات التي تديرها كل وحدة غير متسقة. في هذا الوقت ، لا يمكن استخدام JDBC لإدارة المعاملات. دعونا نلقي نظرة على قطعة من الكود:
/ ** معالجة أمر الدفع **/ transactional (rollbackfor = inspecies.class) public void completedorder () {orderdao.update () ؛ // order order reduction report addats orduction accountservice.update () ؛ // اتصل بخدمة حساب الصندوق لإضافة نقاط إلى نقاط حساب الصندوق .update () ؛ // استدعاء خدمة النقاط لإضافة نقاط إلى حساب حساب Points AccountingService.insert () ؛ // اتصل بالخدمة المحاسبية لكتابة نظام المحاسبة الأصلي القسيمة المحاسبية MerchantNotifyService.Notify () ؛ // اتصل بخدمة إشعار التاجر لإرسال إشعار نتيجة الدفع إلى التاجر}الرمز أعلاه هو عملية عملية دفع بسيطة ، والتي تسمى خمس خدمات ، وكلها تسمى من خلال RPC. كيفية ضمان اتساق المعاملات باستخدام JDBC؟ لقد أضفت التعليق التوضيحي transactional إلى هذه الطريقة ، ولكن بسبب استخدام الخدمة الموزعة ، لا يمكن للمعاملة تحقيق تأثير الحمض.
معاملات JTA أقوى من معاملات JDBC. يمكن أن تحتوي معاملة JTA على العديد من المشاركين ، بينما تقتصر معاملة JDBC على اتصال قاعدة بيانات واحدة. يمكن أن تشارك مكونات أي من منصات Java التالية في معاملة JTA: JDBC Connection ، JDO Persistencemanager Object ، JMS Queue ، JMS Topic ، Enterprise Javabeans (EJB) ، ومخصص للموارد المترجمة مع تحديد بنية موصل J2EE.
تعريف JTA
Java Transaction API (JTA) هي إصدار إصدار Java Enterprise من واجهة برنامج التطبيق. في بيئة Java ، فإنه يتيح إكمال المعاملات الموزعة عبر موارد XA المتعددة.
توفر JTA وخدمة معاملات JAVA COMPATRIOT (JTS ؛ JAVA TransactionService) خدمات معاملات موزعة لمنصة J2EE. ومع ذلك ، توفر JTA واجهة فقط ولا توفر تطبيقًا محددًا. بدلاً من ذلك ، يتم توفيره بواسطة موفر خادم J2EE وفقًا لمواصفات JTS. هناك العديد من تطبيقات JTA الشائعة:
1. تنفيذ JTA (JBOSS) المقدمة من حاوية J2EE
2. تطبيقات JTA المستقلة: مثل JOTM ، Atomikos. يمكن استخدام هذه التطبيقات في البيئات التي لا تستخدم خوادم تطبيق J2EE لتوفير ضمانات المعاملات الموزعة. مثل تطبيقات Tomcat و Jetty و Java العادية.
توفر JTA java.transaction.usertransaction ، والتي تحدد الطرق التالية.
هنا ، تجدر الإشارة إلى أنه يمكن تحويل عمليات JDBC العادية مباشرة إلى عمليات JTA دون استخدام usertransaction. JTA لديها متطلبات مصدر البيانات والاتصال والموارد. فقط الفئات التي تتوافق مع مواصفات XA وتنفيذ الواجهات ذات الصلة لمواصفات XA التي يمكن أن تشارك في معاملات JTA. فيما يتعلق بمواصفات XA ، يرجى الاطلاع على المقدمة ذات الصلة في مقال آخر في مقالتي. هنا ، دعني أذكر أن قواعد البيانات الرئيسية الحالية تدعم مواصفات XA.
لاستخدام معاملات JTA ، تحتاج إلى برنامج تشغيل JDBC الذي ينفذ javax.sql.xadatasource و javax.sql.xaconnection وواجهات javax.sql.xaresource. سيفعل السائق الذي ينفذ هذه الواجهات المشاركة في معاملات JTA. كائن XadataSource هو مصنع لكائن Xaconnection. Xaconnection هو اتصال JDBC يشارك في معاملات JTA.
لاستخدام معاملات JTA ، يجب عليك استخدام Xadatasource لإنشاء اتصال قاعدة البيانات ، والاتصال الناتج هو اتصال XA.
الفرق بين اتصال XA (javax.sql.xaconnection) واتصال غير XA (java.sql.connection) هو أن XA يمكنه المشاركة في معاملات JTA ولا يدعم الالتزامات التلقائية.
نموذج الرمز:
public void jtatransfer () {javax.transaction.usertransaction tx = null ؛ java.sql.connection conn = null ؛ حاول {tx = (javax.transaction.usertransaction) context.lookup ("java: comp/usertransaction") ؛ // الحصول على معاملات JTA ، في هذه الحالة ، تتم إدارة حاوية JBOSS بواسطة javax.sql.datasource ds = (javax.sql.datasource) context.lookup ("java:/xaoracleds") ؛ // احصل على تجمع اتصال قاعدة البيانات ، يجب أن يكون هناك قاعدة بيانات وسائق يدعم XA يدعم tx.begin () ؛ conn = ds.getConnection () ؛ // قم بتعيين الالتزام التلقائي بـ FALSE ، // إذا تم تعيينه على TRUE ، فسوف تتعرف قاعدة البيانات على كل تحديث للبيانات كمعاملة ويقومون تلقائيًا بإرسال conn.setautocommit (false) ؛ stmt = conn.createstatement () ؛ // قلل المبلغ في الحساب A بمقدار 500 STMT.Execute ("/ تحديث T_Account Set المبلغ = المبلغ - 500 where account_id = 'a'") ؛ // قم بزيادة المبلغ في الحساب B بمقدار 500 STMT.Execute ("/ تحديث T_Account Set المبلغ = المبلغ + 500 حيث account_id = 'b'") ؛ // قم بزيادة المبلغ في الحساب B بمقدار 500 STMT.Execute ("/ تحديث T_Account Set المبلغ = المبلغ + 500 حيث account_id = 'b'") ؛ // قم بزيادة المبلغ في الحساب B بمقدار 500 STMT.Execute ("/ تحديث T_Account Set المبلغ = المبلغ + 500 حيث account_id = 'b'") ؛ // ارتكاب معاملة tx.commit () ؛ // التزام المعاملات: تنجح عملية النقل المكونة من خطوتين في نفس الوقت} catch (sqlexception sqle) {try {// استثناء يحدث ، rollback () في هذه المعاملة ؛ // تراجع المعاملات: يتم إلغاء التشغيل المكون من خطوتين للنقل بالكامل STMT.Close () ؛ conn.close () ؛ } catch (استثناء تجاهل) {} sqle.printstacktrace () ؛ }} المثال أعلاه هو عملية نقل باستخدام معاملات JTA. تعتمد هذه العملية نسبيًا على حاوية J2EE وتتطلب الحصول على usertransaction والاتصال من خلال JNDI.
المعاملات الموزعة القياسية
تتضمن المعاملة الموزعة مدير معاملات وواحد أو أكثر من مديري الموارد. مدير الموارد هو متجر بيانات مستمر من أي نوع. يتحمل مدير المعاملات مسؤولية التواصل بين جميع المشاركين في المعاملات.
انظر إلى المقدمة أعلاه للمعاملات الموزعة ، هل تشبه إدارة المعاملات في 2pc؟ ومع ذلك ، فإن 2pc هي في الواقع طريقة تنفيذ لمدير المعاملات يتوافق مع مواصفات XA لتنسيق مديري الموارد المتعددين. لقد كان لدي العديد من المقالات على 2pc و 3pc من قبل. في تلك المقالات ، قدمت كيف يقوم مدير المعاملات في المعاملات الموزعة بتنسيق الالتزام الموحد أو التراجع عن المعاملات المتعددة. سأقدم أيضًا بالتفصيل المحتوى المتعلق بالمعاملات الموزعة ، بما في ذلك على سبيل المثال لا الحصر المعاملات العالمية ، نماذج DTP ، المعاملات المرنة ، إلخ.
إيجابيات وسلبيات JTA
ميزة JTA هي أنها توفر محلول معاملة موزعة وحمض صارم. ومع ذلك ، فإن إدارة معاملات JTA القياسية ليست شائعة في التنمية اليومية لأنها تحتوي على العديد من أوجه القصور:
مجمع التنفيذ
عادة ، يجب الحصول على JTA usertransaction من JNDI. هذا يعني أنه إذا استخدمنا JTA ، فنحن بحاجة إلى استخدام كل من JTA و JNDI.
JTA نفسها هي واجهة برمجة تطبيقات ضخمة.
عادةً ما لا يمكن استخدام JTA إلا في بيئات خادم التطبيق ، لذلك سيؤدي استخدام JTA إلى الحد من قابلية إعادة استخدام الرمز.
لخص
هناك ثلاثة أنواع من معاملات Java: معاملة JDBC ، ومعاملة JTA (JAVA Transaction API) ، ومعاملة الحاوية. من بينها ، استخدام تشغيل معاملات JDBC بسيط نسبيًا ومناسبًا للتعامل مع عمليات مصدر البيانات نفسه. معاملات JTA معقدة نسبيًا ويمكن استخدامها للتعامل مع المعاملات عبر قواعد بيانات متعددة. هم حل للمعاملات الموزعة.
اسمحوا لي أن أتحدث باختصار عن ذلك هنا. على الرغم من أن معاملات JTA هي مجموعة من واجهات برمجة التطبيقات التي توفرها Java للمعاملات الموزعة ، فإن منصات J2EE المختلفة لها تطبيقات مختلفة وليست مريحة للغاية للاستخدام. لذلك ، لا يتم استخدام واجهة برمجة التطبيقات الأكثر مسؤولية بشكل عام في المشاريع. تشمل حلول المعاملات الموزعة التي شائعة الاستخدام في الصناعة الآن ضمان الرسائل غير المتزامن ، TCC ، إخطار الجهد القصوى ، إلخ.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.