English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في إدارة المعاملات في Spring Boot، يتم تنفيذ واجهة PlatformTransactionManager.
public interface PlatformTransactionManager { org.springframework.transaction.TransactionStatus getTransaction(org.springframework.transaction.TransactionDefinition transactionDefinition) throws org.springframework.transaction.TransactionException; void commit(org.springframework.transaction.TransactionStatus transactionStatus) throws org.springframework.transaction.TransactionException; void rollback(org.springframework.transaction.TransactionStatus transactionStatus) throws org.springframework.transaction.TransactionException; }
عندما نستخدم إضافة spring-boot-starter-jdbc، سيقوم الإطار بتدفق التلقائي DataSourceTransactionManager. لذلك، لا نحتاج إلى تكوين إضافي يمكننا استخدامه لتشغيل تعليق @Transactional.
مدير المعاملات JDBC
في Service، ستدعم الطريقة التي يتم تعليقها @Transactional المعاملات. إذا كانت التعليق على الفئة، فإن جميع طرق الفئة تدعم المعاملات بشكل افتراضي.
حالة المعاملات المتعددة
النقطة الأولى: يمكننا تحقيق واجهة TransactionManagementConfigurer، والقيمة التي تعود هي مدير المعاملات الافتراضي.
النقطة الثانية: يمكننا تعيين value على طريقة التنفيذ
إذا كان هناك عدة مستودعات PlatformTransactionManager في خزان Spring، وليس لدينا تحديد قيمة افتراضية من خلال واجهة TransactionManagementConfigurer، فإنه يجب علينا استخدام @Transactional مع تحديد value عند استخدامنا التعليق في الطريقة، وإلا سيتم رفع استثناء.
//@EnableTransactionManagement // تفعيل إدارة المعاملات بالتعليق، مما يعادل <tx:annotation-driven /> في ملف التكوين XML @SpringBootApplication public class ProfiledemoApplication implements TransactionManagementConfigurer { @Resource(name="txManager2") private PlatformTransactionManager txManager2; // إنشاء مدير المعاملات يدويًا1 سيقوم إطار البيانات المصدر بتدفق التلقائي //في خزان Spring، يتم تحميل التعليق @Bean يدويًا أولاً، لن يتم إعادة إنشاء PlatformTransactionManager أيضًا من قبل الربح. @Bean(name = "txManager1") public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } // إنشاء إدارة المعاملات 2 @Bean(name = "txManager2") public PlatformTransactionManager txManager2(EntityManagerFactory factory) { return new JpaTransactionManager(factory); } // تحقيق واجهة TransactionManagementConfigurer وهي قيمة العودة تمثل إدارة المعاملات الافتراضية عند وجود عدة إدارات معاملات @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager2; } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } }
التحديد
@Component public class DevSendMessage implements SendMessage { // تحديد value بشكل محدد لتحديد مستخدم إدارة المعاملات @Transactional(value="txManager1") @Override public void send() { System.out.println(">>>>>>>>Dev Send()<<<<<<<<"); send2(); } @Transactional public void send2() { System.out.println(">>>>>>>>Dev Send2()<<<<<<<<"); } }
الفرق بين المستوى
public enum Isolation { DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE); private final int value; Isolation(int value) { this.value = value; } public int value() { return this.value; } }
تحديد الطريقة: من خلال استخدام خاصية isolation، على سبيل المثال:
@Transactional(isolation = Isolation.DEFAULT)
سلوك التوزيع
ما يعنيه سلوك التوزيع للمهمة هو، إذا كان هناك سياق مهمة موجود قبل بدء هذه المهمة الحالية، فإن هناك خيارات متعددة يمكن استخدامها لتعيين سلوك تنفيذ هذه المهمة.
يمكننا رؤية أن فئة org.springframework.transaction.annotation.Propagation تعريف 6 قيم تمثيلية لسلوك التوزيع:
public enum Propagation { REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), NEVER(TransactionDefinition.PROPAGATION_NEVER), NESTED(TransactionDefinition.PROPAGATION_NESTED); private final int value; Propagation(int value) { this.value = value; } public int value() { return this.value; } }
REQUIRED: إذا كانت هناك معاملة موجودة، يتم إدراجها في هذه المعاملة؛ إذا لم يكن هناك معاملة، يتم إنشاء معاملة جديدة. القيمة الافتراضية.
SUPPORTS: إذا كانت هناك معاملة موجودة، يتم إدراجها في هذه المعاملة؛ إذا لم يكن هناك معاملة، يستمر بالتشغيل بطريقة غير معامل.
MANDATORY: إذا كانت هناك معاملة موجودة، يتم إدراجها في هذه المعاملة؛ إذا لم يكن هناك معاملة، يتم رمي استثناء. (إجباري في المعاملة)
REQUIRES_NEW: إنشاء معاملة جديدة، إذا كان هناك معاملة موجودة، يتم تعليق المعاملة الحالية. (يستخدم عادةً لتسجيل السجلات، حتى إذا تم التراجع، ستتم تنفيذ هذه المعاملة أيضًا، لتسجيل معلومات الخطأ)
NOT_SUPPORTED: تشغيل غير معامل، إذا كان هناك معاملة موجودة، يتم تعليق المعاملة الحالية.
NEVER: تشغيل غير معامل، إذا كان هناك معاملة موجودة، يتم رمي استثناء.
NESTED: إذا كان هناك معاملة موجودة، يتم إنشاء معاملة كمعاملة فرعية للمعاملة الحالية لتشغيلها؛ إذا لم يكن هناك معاملة، فإن هذا القيمة تساوي REQUIRED.
طريقة التحديد: باستخدام خاصية propagation، مثلًا:
@Transactional(propagation = Propagation.REQUIRED)
حالة عدم التراجع للمعاملات
سيتم التراجع فقط عند حدوث RuntimeException غير محمي
التقاطع للمشاكل التي تُلقيها، سيتم نجاح إدخال البيانات مرتين
@Override @Transactional public void insertandinsert(Staff staff) { staffDao.insert(staff); try { int i = 1 / 0; } e.printStackTrace(); } staffDao.insert(staff); }
أضف جملة: TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); في جملة catch في دالة method في طبقة service، ليدفع يدويًا إلى عدم إدخال البيانات.
@Override @Transactional public void insertandinsert(Staff staff) throws Exception { try { staffDao.insert(staff); int i=1/0; staffDao.insert(staff); } TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
هذا هو نهاية محتوى هذا المقال، آمل أن يكون قد ساعدكم في تعلم الكثير، وأتمنى أن تشجعوا دروس الصياغة كثيرًا.
إعلان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المادة مملوكة للمالك الأصلي، يتم جمع المحتوى من قبل المستخدمين على الإنترنت ورفعه بشكل تلقائي، لا يملك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فأنت موصى به أن ترسل بريدًا إلكترونيًا إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') لتقديم الشكوى، وتقديم الأدلة ذات الصلة، إذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المزعوم بشكل فوري.