1. آلية معاملة الربيع
تحتوي جميع تقنيات الوصول إلى البيانات على آليات لمعالجة المعاملات ، والتي توفر واجهات برمجة التطبيقات لتمكين المعاملات ، أو تلبية المعاملات لإكمال عمليات البيانات ، أو تراجع البيانات عند حدوث خطأ.
تستخدم آلية معاملات Spring آلية موحدة للتعامل مع معاملات تقنيات الوصول إلى البيانات المختلفة. توفر آلية معاملات Spring واجهة PlatformTransActionManager ، ويتم تنفيذ معاملات تقنيات الوصول إلى البيانات المختلفة باستخدام واجهات مختلفة:
رمز تحديد مدير المعاملات في البرنامج هو كما يلي:
bean platformTransActionManager TransactionManager () {jPatransActionManager TransactionManager = new JPatransactionManager () ؛ TransactionManager.setDataSource (datasource ()) ؛ إرجاع المعاملة. }2. المعاملات التعريفية
يدعم Spring المعاملات التعريفية ، أي باستخدام التعليقات التوضيحية لتحديد الطريقة التي تحتاج إلى استخدام المعاملات. يستخدم التعليق التوضيحي transactional للإشارة إلى الطريقة التي تتطلب بها الطريقة دعم المعاملات.
transactional public void SaveSoming (معرف طويل ، اسم السلسلة) {// عملية قاعدة البيانات}من المهم أن نلاحظ هنا أن التعليق التوضيحي transactional يأتي من حزمة org.springframework.transaction.annotation ، وليس javax.transaction.
يوفر Spring شرحًا enabletransactionmanagement لتمكين دعم المعاملات التعريفية في فئات التكوين. بعد استخدام enableTransActionManagement ، ستقوم حاوية Spring تلقائيًا بمسح الأساليب والفئات المشروحة @transactional. يتم استخدام enableTransActionManagement على النحو التالي:
configuration enableTransActionManagement فئة عامة appconfig {}3. استخدم @transactional على مستوى الفصل
لا يمكن لـ transactional التعليق على الأساليب فحسب ، ولكن أيضًا على الفصول الدراسية. عند التعليق على الفصل ، فهذا يعني أن جميع الأساليب العامة لهذه الفئة يتم تنشيطها للمعاملات. إذا كان مستوى الفصل ومستوى الطريقة يستخدمون @transactional التعليق التوضيحي على مستوى الفصل ، فسيتم تحميل شرح مستوى الطريقة باستخدام مستوى الفصل.
4. دعم المعاملات لبيانات الربيع JPA
يتيح Dring Data JPA دعم المعاملات لجميع الطرق الافتراضية ، ويتم تمكين الخاصية readOnly = True افتراضيًا لمعاملات الاستعلام.
يمكن ملاحظة ذلك من الكود المصدري SimplejParePository بأن SimpleJParePository يعرّف @transactional (ReadOnly = true) على مستوى الفصل ، في حين يتم إعادة كتابة خاصية transactional في العمليات المتعلقة بحفظ وحذف. في هذا الوقت ، تكون الخاصية القراءة خاطئة ، ولا تزال عمليات الاستعلام الأخرى قراءتها خاطئة.
5. دعم معاملات SPRING BOOT
1. مدير المعاملات الذي تم تكوينه تلقائيًا
عند استخدام JDBC كتقنية للوصول إلى البيانات ، يحدد Springboot حبة PlatformTransactionManager بالنسبة لنا. انظر التعريف في فئة org.springframework.boot.autoconfigure.jdbc.datasourcetransactionManagerautoconfiguration:
beanconditionalonMissingBeanconditionalonBean (datasource.class) platformtransactionManager TransactionManager () {return new DataSourCetRansActionManager (this.datasource) ؛ }عند استخدام JPA كتكنولوجيا للوصول إلى البيانات ، يحدد SPRING BOON حبة لتنفيذ PlatformTransActionManager لـ JPatransactionManager ؛ انظر التعريف في org.springframework.boot.autoconfigure.orm.jpa.jpabaseConfiguration.class الفئة:
beanconditionalonMissingBean (platformTransActionManager.class) platformTransActionManager TransactionManager () {return New JPatransActionManager () ؛ } 2. تمكين دعم معاملات التعليقات التوضيحية تلقائيًا
يستخدم SPRING BOOT خصيصًا لتكوين المعاملات كـ org.springframework.boot.autoconfigure.transaction.transactionautoconfiguration. تعتمد فئة التكوين هذه على تكوين jpabaseconfiguration و datasourcetransactionmanagerautoconfiguration.
يتم تمكين دعم المعاملات التعريفية أيضًا في تكوين DataSourCetransActionManageraUtoconFiguration ، والرمز كما يلي:
@conditionalonmissingbean (AbstractTransActionManagementCompion.Class) configuration enabletransactionmanagement محمية معاملة فئة ثابتة محمية {}لذلك في SPRING BOOT ، ليست هناك حاجة لعرض enabletransactionantation acked.
6. مثال (سبرينغ بوت)
1.pom.xml:
<Rependency> <roupeD> org.springframework.boot </rougiD> <intifactid> Spring-Boot-Starter-Web </stifactid> </premotency> <reperence> <roupiD> org.SpringFramework.Boot </rougeid> <roupl> org.springframework.boot </groupId> <StifactId> Spring-boot-starter-data-rest </artifactid> </premitency> <sependency> runtim
2.Application.yml:
الخادم: المنفذ: 5000 ربيع: DataSource: Class-Class-Name: com.mysql.jdbc.driver url: jdbc: mysql: // localhost: 3306/test؟ useUnicode = true & characterencoding = utf8 & forfectresults = utf8 username: password password: عرض SQL: صحيح
3. طاقم فئة الكيان:
entity staff class public {idgeneratedValue private long id ؛ اسم السلسلة الخاصة ؛ عصر عدد صحيح خاص ؛ عنوان السلسلة الخاص ؛ الموظفين العامين () {super () ؛ } الموظفين العامين (معرف طويل ، اسم سلسلة ، عصر عدد صحيح ، عنوان السلسلة) {super () ؛ this.id = id ؛ this.name = name ؛ this.age = العمر ؛ this.address = العنوان ؛ } // حذف الأساليب والتعيين}4. مستودع الموظفين:
الواجهة العامة stuffrepository يمتد jParePository <staff ، long> {}5. واجهة الخدمة:
خدمة الموظفين العامة {موظفو الموظفين العامين SavestaffwithRollback (موظفي الموظفين) ؛ // Rollingback Public SavestaffwithoutoTrollback (موظفي الموظفين) ؛ // لا تراجع}}6. تنفيذ الخدمة:
Service Public Class ServiceImpl تنفذ خدمة الموظفين {autowired stuffrepository stuffrepository ؛ // يمكنك حقن فول مباشرة من RersonRepository. Override // استخدم سمة التراجع عن التعليق التوضيحي transactional لتحديد استثناء محدد ، سيتم إعادة البيانات. transactional (Rollbackfor = {invalualArgumentException.class}) الموظفين العامين SavestaffwithRollback (موظفي الموظفين) {staff s = stuffrepository.save (staff) ؛ if (staff.getName (). يساوي ("Zhang San")) {رمي New IllegalArgumentException ("Zhang San موجود بالفعل ، التراجع") ؛ } العودة s ؛ } Override Public SavestaffwithoutOrrollback (موظفي الموظفين) {staff s = stuffRepository.save (staff) ؛ if (staff.getName (). يساوي ("Zhang San")) {رمي New IllevalArgumentException ("Zhang San موجود بالفعل ، لا تتدحرج البيانات") ؛ } العودة s ؛ }}7.controller:
RestController @requestmapping ("/staff") من الدرجة العامة staffController {AUTOWIRED SUSTORSSERSER SERVERS. // اختبر وضع التراجع @requestmapping ("/rollback) للموظفين العامين (موظفي الموظفين) {return staffsservice.savestaffwithrollback (staff) ؛ }. }}8. قم بإجراء الاختبار:
(1) التراجع: http: // localhost: 5000/staff/fladback؟ name = Zhang San & Age = 18
وحدة التحكم:
قاعدة البيانات:
(2) لا تراجع: http: // localhost: 5000/staff/notrollback؟ name = Zhang San & Age = 18
وحدة التحكم:
قاعدة البيانات:
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.