يدرس هذه المقالة بشكل أساسي المحتوى ذي الصلة لآلية معاملات الربيع ، على النحو التالي.
عادة ما يكون هناك استراتيجيتان للمعاملات: المعاملات العالمية والمعاملات المحلية. يمكن أن تمتد المعاملات العالمية إلى موارد معاملات متعددة (أي مصادر البيانات ، وقواعد البيانات عادةً وقوائم رسائل) ، وعادة ما تتطلب إدارة خوادم تطبيق J2EE ، والتي تتطلب دعم JTA للخادم في الأسفل. ترتبط المعاملات المحلية بتكنولوجيا الثبات التي اعتمدتها الطبقة الأساسية. إذا كانت الطبقة الأساسية تستخدم مباشرة JDBC ، فيجب استخدام كائن الاتصال لتشغيل المعاملة. إذا تم استخدام تقنية ثبات السبات ، فأنت بحاجة إلى استخدام كائن الجلسة لتشغيل المعاملة.
بشكل عام ، تكون عملية البرمجة باستخدام معاملات JTA ومعاملات JDBC ومعاملات السبات تقريبًا على النحو التالي.
كما يتضح من الشكل أعلاه ، باستخدام برمجة المعاملات التقليدية ، يجب أن يقترن رمز البرنامج مع واجهة برمجة التطبيقات لسياسات المعاملات المحددة. إذا احتاج التطبيق إلى تبديل الإستراتيجية ، فهذا يعني أنه يجب تعديل الكود بشكل كبير. ولكن إذا كنت تستخدم معاملات الربيع ، فلن تكون هناك مشكلة.
لا يوفر Sring أي دعم للمعاملات ، فهو مسؤول فقط عن لف المعاملات الأساسية ، وفي مستوى الربيع ، يوفر واجهة برمجة برمجة موحدة للعالم الخارجي. جوهر معاملة الربيع هو واجهة PlatformTransActionManager.
تمثل PlatformTransactionManager واجهة معاملات مستقلة عن النوع المحدد ويمكن أن تمثل أي معاملة ، بما في ذلك معاملات JDBC ، ومعاملات السبات ، وحتى معاملات JTA.
آلية معاملة Springa هي نموذج سياسي نموذجي. تمثل PlatformTransactionManager واجهة إدارة المعاملات ، لكنها لا تعرف كيفية إدارة المعاملات. يتطلب الأمر فقط إدارة المعاملات لتوفير ثلاث طرق: ابدأ معاملة getTransaction(), والمعاملات commit() rollback() ومع ذلك ، يتم ترك التنفيذ المحدد لفئة التنفيذ الخاصة به لإكمال. يحتاج المبرمجون فقط إلى تكوين نوع المعاملة في ملف التكوين وفقًا لنوع المعاملة المحدد المستخدم. سيستخدم الربيع الأساسي تلقائيًا فئة تنفيذ المعاملات المحددة لإجراء عمليات المعاملات. بالنسبة للمبرمجين ، لا يحتاجون إلى الاهتمام بالعملية الأساسية على الإطلاق ، بل يحتاجون فقط إلى برمجة واجهة PlatformTransActionManager. توفر واجهة PlatformTransActionManager الطرق التالية: getTransaction(..), commit(); rollback(); هذه كلها عمليات معاملات لا علاقة لها بالمنصة.
الكتابة الكاملة لـ getTransaction() هي TransactionStatus getTransaction(TransactionDefinition definiton)
يتم استخدام هذه الطريقة لإرجاع كائن معاملة ، ويمكن للمعاملة المعاملة تحديد السمات المختلفة لكائن المعاملة. عادة ، يمكن أن يحدد سمات العزل للمعاملة ، وسمات الانتشار ، والمدة ، وقراءة هذه السمات فقط.
تتطلب إدارة المعاملات المحددة من Spring من PlatformTransActionManager تكوين في ملف التكوين. فيما يلي تكوين الربيع المقابل لأنواع مختلفة من المعاملات.
تكوين مدير المعاملات المحلي لمصدر بيانات JDBC كما يلي:
<!-حدد حبة مصدر البيانات ، واستخدم مصدر بيانات C3P0 لتنفيذها ، وحقن المعلومات اللازمة لمصدر البيانات-> <bean id = "dataSource" تدمير method = "elling" p: driverclass = "com.mysql.jdbc.driver" p: jdbcurl = "jdbc: mysql: P: maxpoolsize = "40" p: minpoolsize = "2" p: initialPoolsize = "2" p: maxidletime = "30" /> <!-تكوين مدير البيانات المحلي لمصدر بيانات JDBC ، استخدم dataSourCeTransActionManager class-> <bean id = "eleccentmanager"
إن تكوين مدير المعاملات العالمي JTA لإدارة الحاويات هو كما يلي:
<bean id = "datasource" p: jndiname = "jdbc /jpetstore" /> <!-باستخدام فئة jtatransactionManager ، تنفذ هذه الفئة من platformTransActionManager واجهة-> <!-باستخدام معاملات JTA Global ، يمكن أن تحصل حاويات Spring على موارد المعاملات من خادم java e e ee من قبل أنفسهم-
بالنسبة للمعاملات العالمية JTA ، تحتاج فقط إلى تحديد فئة تنفيذ مدير المعاملات JTatransactionManager. ستحصل حاوية Spring على مصدر البيانات من خادم J2EE بمفرده ، دون حقن صريح في مدير المعاملات.
إن تكوين المعاملات المحلية الربيع بناءً على تقنية ثبات السبات هو كما يلي.
<!-حدد حبة مصدر البيانات ، واستخدم مصدر بيانات C3P0 لتنفيذها ، وحقن المعلومات اللازمة لمصدر البيانات-> <bean id = "dataSource" تدمير method = "elling" p: driverclass = "com.mysql.jdbc.driver" p: jdbcurl = "jdbc: mysql: P: maxpoolsize = "40" p: minpoolsize = "2" p: initialPoolSize = "2" p: maxidletime = "30" /> <!-تحديد sessionfactory من hibernate ، الاحتياجات الجلسية للاعتماد على مصدر البيانات ، محقلة البيانات-> <bean id = "sessionfactory يتم استخدام CountatedClasses لإدراج جميع الفئات الثابتة-> <property name = "annotatedclasses"> <list> <!-يتم استخدام ما يلي لسرد جميع فئات PO-> <SALUE> com.entity.user </value> </list> </propert hibernate-> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdialect </prop> <!-سواء لإنشاء جداول بيانات بناءً على جداول رسم الخرائط heibernate-> <prop key = "hibernate.hbm2ddl.auto" مدير البيانات المحلي في Hibernate ، باستخدام فئة HiberNatetRansActionManager-> <!-هذه الفئة هي تنفيذ محدد لواجهة platformTransActionManager لـ hibernate-> <!-تكوين hibernatetransactactionmanager يتطلب SessionFactory-> <bean id = "p: p: sessionfactory-ref =" sessionfactory " />
إذا تعتمد معاملات الربيع على سياسة السبات ، فستكون هناك حاجة إلى ثلاث نقاط بشكل عام لتكوين: مصدر البيانات ، SessionFactory ، ومدير المعاملات.
إذا كانت الطبقة الأساسية تستخدم تقنية طبقة ثبات السبات وتستخدم المعاملة معاملة JTA Global ، فإن التكوين هو كما يلي:
<!-تكوين مصدر بيانات JTA-> <bean id = "datasource" p: jndiname = "jdbc /jpetstore" /> <!-تحديد Hibernate SessionFactory. يحتاج SessionFactory إلى الاعتماد على مصدر البيانات وحقن مصدر البيانات-> <bean id = "sessionfactory" p: datasource-ref = "dataSource"> <!-يتم استخدام annotatedclasses لإدراج جميع الفئات الثابتة-> <sale> </property> <!-تحديد خاصية SessionFactory لـ Hibernate-> <property name = "hibernateProperties"> <bors> <!-حدد لهجة الاتصال لـ hibernate-> <propear key = "hibernate.dialect"> org.dialect.dialect.mysql5innnoDial الجداول-> <prop key = "hibernate.hbm2ddl.auto"> تحديث </prop> </props> </property> </ban> <!-استخدم فئة JTatransActionManager ، وهي فئة تنفيذ من واجهة PlatformTransActionManager-> <!
بالمقارنة مع معاملة الربيع السابقة القائمة على السبات ، فإن هذا هو استبدال مصدر البيانات بمصدر بيانات JNDI واستبدال مدير المعاملات بـ JTatransactionManager.
بالنسبة للمعاملات العالمية JTA ، نظرًا لأن دعم خادم التطبيق الأساسي مطلوب ، فقد تكون هناك اختلافات في التفاصيل بين معاملات JTA Global التي توفرها خوادم التطبيقات المختلفة. لذلك ، عند تكوين مدير المعاملات العالمي فعليًا ، قد تحتاج إلى استخدام فئات فرعية من JTatransactionManager ، مثل OC4JJTATRANTACTICTACTIONGANGER التي توفرها خادم تطبيق Javaee's Javaee ، و WebLogicJtArtanctactionManager الذي توفره Oracle لـ WebLogic ، و WebSphereUowTransActionManager المقدمة من IBM لـ WebSphere ، وما إلى ذلك ، وما إلى ذلك.
من تكوين الربيع لمختلف أنواع المعاملات أعلاه ، يمكن ملاحظة أنه عندما يتبنى التطبيق إدارة معاملات الربيع ، لا يحتاج التطبيق إلى اقترانها مع واجهة برمجة تطبيقات المعاملة المحددة. يجب برمج التطبيق فقط لواجهة PlatorMtransactionManager. سيقوم ApplicationContext بتحديد فئة تنفيذ سياسة المعاملة المناسبة (أي فئة التنفيذ الخاصة بـ PlatorMtransActionManager) بناءً على ملف التكوين.
لذلك بالتفصيل كيفية إجراء برمجة التحكم في المعاملات في الربيع ، عادة ما تكون هناك طريقتان.
إدارة معاملات البرمجة: إنها لاستخدام الأساليب التجريدية الثلاث التي توفرها PlatorMtransActionManager مباشرة للتحكم في تدفق المعاملات في الكود. يمكنك أيضًا الحصول على حبة من نوع platormtransactionmanager في حاوية الربيع. هذه الفول هي دائمًا مثيل لفئة التنفيذ المحددة لـ PlatorMtransactionManager. يتم تحديد فئة التنفيذ المحددة بواسطة ApplicationContext وفقًا لنمط السياسة. لا يحتاج المبرمجون إلى الاهتمام بذلك ، بل يحتاجون فقط إلى برمجة الواجهة الموجهة نحو الواجهة.
إدارة المعاملات التصريفية: لا تتطلب هذه الطريقة عملية التحكم في المعاملة في الكود ، ولكنها تستخدم AOP لإكمال دمج المعاملة تمامًا من خلال ملفات التكوين. أي أن ملفات تكوين XML يمكنها تكوين وكلاء المعاملات لمكونات الأعمال ، ويوفر عوامل المعاملات التحكم في المعاملات لمكونات الأعمال. الآن هذه الطريقة هي الأفضل ، مع أدنى اقتحام رمز المصدر.
عند استخدام المعاملات التعريفية ، تحتاج فقط إلى كتابة ملف تكوين وتكوين أنواع المكونات التي تتطلب التحكم في المعاملة. سيتم نسج مكونات العمل إلى التحكم في المعاملات بموجب آلية AOP ، ولا يحتاج المبرمجون إلى كتابة أي رمز لإدارة المعاملات ويمكنهم التركيز على تطوير مكونات العمل. لذلك ، يوصى بشكل عام بإدارة المعاملات التعريفية.
توفر طريقة مخطط XML من Spring استراتيجية موجزة تكوين المعاملات. يقوم بتكوين معالجة تعزيز المعاملات من خلال مساحة الاسم <tx:advice> ، حيث يمكن تحديد سمات مختلفة للمعاملة (مثل سمات العزلة ، وسمات الانتشار ، والتهمة ، وسمات القراءة فقط ، وما إلى ذلك) ، ثم يمكن أن تكون تعزيز المعامل العمليات. فيما يلي مثال بسيط ، تكوين حبة newsdaoimpl لعمليات البيانات ، وذلك باستخدام مصدر بيانات C3P0 ، ومدير معاملات JDBC من Spring ، وإعداد خصائص المعاملات في <TX: نصيحة.
تكوين الربيع الكامل على النحو التالي:
<؟ xmlns: p = "http://www.springframework.org/schema/p" XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx/spring-tx-4 مصدر البيانات ، استخدم مصدر بيانات C3P0 لتنفيذه ، وحقن المعلومات اللازمة لمصدر البيانات-> <bean id = "datasource" تدمير method = "close" p: driverclass = "com.mysql.jdbc.driver" p: jdbcurl = "jdbc: mysql: // localhost/test؟ use upeUnicode = true & thaught- P: user = "root" p: password = "" p: maxpoolsize = "40" p: minpoolsize = "2" p: initialPoolsize = "2" p: maxidletime = "30" /> <!-تكوين مدير البيانات المحلي لمصدر بيانات JDBC ، استخدم datastransactionmanager- P: DataSource-REF = "DataSource" /> <!-تكوين حبة منطق أعمال-> <bean id = "newsdao" p: ds-ref = "dataSource" /> <!-تكوين معالجة المعاملات "المعاملات" ، تحديد المعاملات-use toxactureded exactage-use to expantaction. -> <tx: entributes> <!-جميع الطرق التي تبدأ بالحصول على القراءة فقط-> <tx: method name = "get*" read-only = "true" /> <! < /tx: expluct> <aop: config> <!-قم بتكوين نقطة إدخال لتتناسب مع تنفيذ جميع الطرق في جميع الفئات الضمنية ضمن حزمة التوقف-> <aop: pointcut expression = "execution (*com.dao.impl. excloy-ref = "txAdvice" pointcut-ref = "mypointcut"/> <!-تكوين نقطة إدخال أخرى لمطابقة تنفيذ جميع الطرق في الفصل بدءًا من ABC ضمن حزمة التوقف-> </aop: config> </bans>
في رمز Newsdaoimpl ، هو إدراج بيانات مكررة في الجدول.
package com.dao.impl ؛ import javax.sql.datasource ؛ استيراد org.springframework.jdbc.core.jdbctemplate ؛ استيراد com.dao.newsdao ؛ public class newsdaiimpl تنفذ newsdao void insert (عنوان السلسلة ، محتوى السلسلة) {// استخدام c3p0 pool jdbctemplate jt = new jdbctemplate (ds) ؛ jt.update ("أدخل في news_inf" + "القيم (100 ،؟ التحكم في المعاملة ، يمكن إدراج السجل الأول // إذا تمت إضافة التحكم في المعاملة ، فلن يتم إدراج السجل الأول}}هنا طريقة الاختبار.
اختبار void static public test3 () {applicationContext ctx = classpathxmlapplicationcontext ("beans4jdbc.xml") ؛ // احصل على وكيل المعاملات Bean Newsdao Dao = (Newsdao) ctx.getBean ("Newsdao" ، newsdao.class) ؛ Dao.insert ("Idea Core of Java Programming" ، "Java EE Development الخفيفة الوزن") ؛ system.out.println ("الانتهاء من التنفيذ") ؛ }سيجد تنفيذ طريقة الاختبار أنه يتم طرح استثناء (بسبب البيانات المكررة) وبسبب التحكم في المعاملات ، لن يكون هناك إدخال بيانات في قاعدة البيانات.
كما ترون في المثال أعلاه ، عادةً في تكوين مخطط XML ، يتم تكوين AOP فعليًا من أجل حبة عادية ، ويتم دمج تحسين المشورة. يتم تكوين تحسين المشورة مع مدير المعاملات ، والذي يعتمد على مصدر البيانات.
بالنسبة لـ <aop: Advisor> ، يتم ربط النصيحة ونقطة الدخول بواسطة معالج الفاصوليا في أسفل الربيع (مثل beannameautoproxycreator ، defaultAdvisorautoproxycreator) ، وهو في الأساس وكيل ديناميكي.
بالإضافة إلى ذلك ، في تحسين التكوين <tx: exprict> ، يمكنك أيضًا تحديد أنه عندما يتم مواجهة استثناء محدد ، لا يجوز لتراجع وقوة لا تراجع ، أي ، flack-for = "xxxexception" ، no-rollback-for = "xxxexception"
بالإضافة إلى استخدام طرق مخطط XML ، يمكنك أيضًا إضافة توضيح Transaction مباشرة إلى الطريقة لجعل هذه الطريقة لها خصائص معاملات. في transaction ، يمكن تكوين خصائص مختلفة للمعاملات (مثل خصائص العزل ، وخصائص الانتشار ، والمهلات ، وخصائص القراءة فقط ، إلخ). بالإضافة إلى ذلك ، من الضروري إضافة تكوين <TX: Eanotation إلى تكوين XML ، مما يشير إلى أن Spring سيقوم بتكوين عامل المعاملة وفقًا للشرح ، بحيث يمكن إكمال تكوين خاصية المعاملة وتكوين AOP في خطوة واحدة فقط (مباشرة من خلال تكوين الاسترداد على اسم الطريقة).
<تكساس: ماناجير المعاملة التي تعتمد على التعليقات التوضيحية = "TransactionManager" />
Newsdaoimpl.
transactional (الانتشار = الانتشار.
ما سبق هو المحتوى الكامل لهذه المقالة حول رمز مثال آلية المعاملات في Spring ، وآمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!