1. أمثلة على سيناريوهات الاستخدام
قبل أن نفهم كيف يتم استخدام transactional ، يجب أن نعرف أولاً ما هو مفيد. اسمحوا لي أن أقدم لكم إبهامًا: على سبيل المثال ، هناك العديد من الأعضاء في قسم ، ويتم تخزين هذين في جدول الإدارة وجدول الأعضاء على التوالي. عند حذف قسم معين ، افترض أننا نحذف الأعضاء المقابلين افتراضيًا. ومع ذلك ، قد يحدث هذا أثناء التنفيذ. نقوم أولاً بحذف القسم ثم حذف الأعضاء. ومع ذلك ، فقد حذفت الإدارة بنجاح ، وحدث استثناء عند حذف الأعضاء. في هذا الوقت ، نأمل أنه في حالة فشل حذف العضو ، فإن الإدارة المحذوفة مسبقًا ستقوم بإلغاء الحذف. يمكن ترحيل هذا السيناريو باستخدام الأشياء transactional.
2. استثناء فحص واستثناء غير محدد
السبب وراء إخبارنا للجميع بمفاهيم الاستثناءات التي تم فحصها والاستثناءات التي لم يتم التحقق منها هو:
يستخدم الربيع معالجة المعاملات التعريفية. بشكل افتراضي ، في حالة حدوث استثناء غير مرتاح في طريقة تشغيل قاعدة البيانات المشروحة ، ستكون جميع عمليات قاعدة البيانات تراجعًا ؛ في حالة حدوث الاستثناء هو استثناء محدد ، ستظل عمليات قاعدة البيانات مقدمة افتراضيًا.
استثناء فحص:
غير صالح ، لا يمكن التنبؤ به في البرنامج. على سبيل المثال ، إدخال المستخدم غير صالح ، لا يوجد ملف أو أخطاء في ارتباط الشبكة أو قاعدة البيانات. هذه كلها أسباب خارجية ولا تسيطر عليها البرنامج.
يجب التعامل معها بشكل صريح في الكود. على سبيل المثال ، قم بتجريب معالجة كتلة التغلب ، أو رمي الاستثناء على الطبقة السابقة من مكدس الاتصال مع وصف رميات.
ورثت من java.lang.exception (باستثناء java.lang.runtimeexception).
استثناء غير محدد:
يشير إلى وجود خطأ ، فإن منطق البرنامج خاطئ. إنها فئة فرعية من RunTimeException ، مثل غير unalfalArgumentException و NullPointerException و IllegalStateException.
ليست هناك حاجة لالتقاط استثناءات غير محددة بشكل صريح في الكود للمعالجة.
ورثت من java.lang.runtimeexception (و java.lang.runtimeexception المورث من java.lang.exception).
بالنظر إلى مخطط التركيب غير الطبيعي أدناه ، قد يكون أكثر طبقة:
3. مثال على استخدام @transactional
يستخدم هذا المثال Eclipse+Maven. تتم إدارة Maven فقط كجرة ، وحتى أصدقاء Maven الذين لا يفهمون يمكنهم فهمها.
3.1. ملف تكوين الربيع
يجب تكوين مساحة اسم TX أولاً على النحو التالي:
من أجل استخدام @إدارة المعاملات المستندة إلى المعاملات ، يكون التكوين التالي مطلوبًا في الربيع:
<bean id = "apptransactionManager"> <property name = "dataSource" ref = "datasource" /> </bean> <tx: anotation-target-target-class = "false" transaction-manager = "apptransactionAgenager" />
ملف تكوين الربيع بالكامل للمدون:
<؟ xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx XSI: Schemalocation = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org http://www.springframework.org/schema/beans http://www.springframework.org/schema/aop/spring-aop-3.0.xsd <!-تقديم ملف تكوين jdbc-> <bean id = "propertyConfigurer"> <property name = "socations"> <list> <value> classpath: properties/*. الخصائص </value> <!-إذا كانت هناك ملفات تكوين متعددة ، فقط تابع لإضافتها هنا->/قائمة </propert <!-تكوين الخصائص-> <!-تكوين الخصائص-> <!-<property name = "driverClassName" value = "com.mysql.jdbc.driver" /> <property name = "url" value = "jdbc: mysql: // localhost: 3306 /learning" / value = "Christmas258@"/>-> <!-استخدم الخصائص لتكوين-> <property name = "driverClassName"> <value> $ {jdbc_driverclassname} </value> </sorperal> <property name = "url"> <value> $ {jdbc_url} </value> </propert <Value> $ {JDBC_USERNAME} </value> </surrent> <property name = "password"> <value> $ {jdbc_password} </value> </sprement> </boun> <bean id = "apptransactionmanager"> <propert Proxy-target-class = "false" معاملة المعاملات = "AppTransactionManager" /> <!-مسح جميع ملفات واجهة Mapper تلقائيًا المقابلة لـ XXXXMAPPER.xml ، بحيث لا تحتاج إلى تكوين رسم خرائط MPER يدويًا واحدًا تلو الآخر. طالما أن فئة واجهة Mapper وملف رسم الخرائط Mapper تتوافق مع بعضها البعض. -> <bean> <property name = "basepackage" value = "com.luo.dao" /> </bean> <!-تكوين ملف myBatis ، mapperlocations تكوين ** mapper.xml موقع ملف ، configlocation تكوين mybatis-config موقع-> name = "mapperlocations" value = "classpath: mapper/*. <السياق: مكون المسح الضوئي package = "com.luo.service" /> </bans>3.2. استخدم transactional لإضافة تعليقات توضيحية إلى طريقة فئة تنفيذ المستخدم
transactional (الانتشار = الانتشار. سلسلة السلسلة = فارغة ؛ if (string.equals ("")) {int i = 0 ؛ }}في الطريقة المذكورة أعلاه ، جعلت عن عمد أن يكون له استثناء مؤشر فارغ وسوف تتراجع الأمور
3.3. قم بتشغيل فئة اختبار الوحدة
test public void addusertest () {user user = new user () ؛ user.setuserName ("luoguohui1") ؛ user.setUserPassword ("luoguohui1") ؛ userService.adduser (user) ؛}لقد وجدت أنه لا يمكن إدراجها ، ولكن إذا تمت إزالة transactional ، فإن الكود كما يلي. على الرغم من حدوث استثناء ، لا يزال هناك بيانات مقابلة تضاف إلى قاعدة البيانات:
3.4. تنزيل رمز المصدر
قم بتنزيل رمز المصدر النهائي لهذه المقالة: first_maven_project_jb51.rar
4. يجب فهم المفاهيم التي @transactional في الربيع
يعتمد Transactional في الربيع على آلية الوكيل الديناميكي ويوفر آلية لإدارة المعاملات الشفافة لتسهيل المشكلات وحلها بسرعة في التطوير.
بشكل عام ، هو التعليق على أساليب أو واجهات أو فئات من خلال الكود التالي:
transactional (الانتشار = الانتشار. not_supported)
يدعم الانتشار 7 آليات انتشار مختلفة:
مطلوب: في حالة وجود معاملة ، يتم دعم المعاملة الحالية. إذا لم تكن هناك معاملة ، يتم بدء معاملة جديدة.
الدعم: في حالة وجود معاملة ، يتم دعم المعاملة الحالية. إذا لم تكن هناك معاملة ، فإن تنفيذ غير الناقص. ومع ذلك ، بالنسبة لمديري معاملات مزامنة المعاملات ، تختلف SPERCTION_SUPORTS قليلاً عن عدم استخدام المعاملات.
not_supported: قم دائمًا بتنفيذ غير ناتج عن العمل وتعليق أي معاملة موجودة.
يتطلب new: ابدأ دائمًا معاملة جديدة. في حالة وجود صفقة بالفعل ، يتم تعليق المعاملة الحالية.
إلزامي: في حالة وجود معاملة بالفعل ، دعم المعاملة الحالية. إذا لم يكن هناك معاملة نشطة ، يتم طرح استثناء.
لا تنفذ أبدًا: دائمًا ما يتم تنفيذها غير الناقص ، في حالة وجود معاملة نشطة
متداخل: في حالة وجود معاملة نشطة ، فإنها تعمل في معاملة متداخلة. إذا لم تكن هناك معاملة نشطة ، فاضغط على الخاصية المطلوبة لتنفيذها.
فيما يلي بعض الأشياء التي يجب ملاحظتها ، والتي يجب قراءتها ، وإلا ، إذا واجهت العديد من المزالق ، لم يذكرك المدون:
فيما يلي بعض الأشياء التي يجب ملاحظتها ، والتي يجب قراءتها ، وإلا ، إذا واجهت العديد من المزالق ، لم يذكرك المدون:
فيما يلي بعض الأشياء التي يجب ملاحظتها ، والتي يجب قراءتها ، وإلا ، إذا واجهت العديد من المزالق ، لم يذكرك المدون:
أضف التعليق التوضيحي transactional حيث تكون إدارة المعاملات مطلوبة. يمكن تطبيق التعليقات التوضيحية transactional على تعريفات الواجهة وطرق الواجهة ، وتعريفات الفئة والأساليب العامة للفئات.
لا يمكن تطبيق التعليقات التوضيحية transactional إلا على الأساليب ذات الرؤية العامة. إذا كنت تستخدم التعليق التوضيحي transactional على طرق محمية أو خاصة أو مرئية ، فلن يبلغ ذلك عن خطأ ، ولكن هذه الطريقة المشروح لن تعرض إعدادات المعاملة المكونة.
لاحظ أن حدوث التعليق التوضيحي transactional لا يكفي لتمكين سلوك المعاملة ، إنه مجرد نوع من البيانات الوصفية. يجب استخدام عنصر التكوين في ملف التكوين لتمكين سلوك المعاملة حقًا.
يتحكم في ما إذا كان يتم إنشاء وكيل مستند إلى الواجهة أو فئة من خلال قيمة سمة "Proxy-Target-Class" للعنصر. إذا تم تعيين قيمة النوع "الفئة" من فئة الوكيل "على" True "، فسيعمل الوكيل المستند إلى الفصل (هذا مطلوب لـ cglib.jar في classpath). إذا تم تعيين قيمة النوع "من فئة الوكيل" على "False" أو تم حذف هذه الخاصية ، فسيعمل الوكيل القياسي المستند إلى واجهة JDK.
يوصي فريق الربيع باستخدام التعليق التوضيحي transactional على فصول محددة (أو طرق للفئات) بدلاً من أي واجهات يريد الفئة تنفيذها. إن استخدام التعليق التوضيحي transactional على واجهة لن يكون ساري المفعول إلا عند إعداد وكيل يستند إلى الواجهة. نظرًا لأنه لا يمكن مورث التعليقات التوضيحية ، فهذا يعني أنه إذا تم استخدام وكيل قائم على الفصل ، فلن يتم التعرف على إعدادات المعاملات بواسطة الوكيل المستند إلى الفصل ، ولن يتم لف الكائن بواسطة وكيل المعاملة.
يتم تمكين معاملات @Transactional ، إما أن يتم إنشاء وكيل مستند إلى الواجهة. لذلك في نفس الفئة ، تستدعي طريقة واحدة طريقة أخرى بالمعاملات ، ولن تعمل المعاملة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.