עסקאות עם אביב ו- JPA

1. סקירה כללית

הדרכה זו תדון הדרך הנכונה להגדיר עסקאות אביב, כיצד להשתמש ב- @ Transactional ביאור ומלכודות נפוצות.

לדיון מעמיק יותר על תצורת ההתמדה הליבה, עיין במדריך Spring with JPA.

בעיקרון, ישנן שתי דרכים נפרדות להגדרת תצורה של עסקאות - ביאורים ו- AOP - כל אחת מהיתרונות שלהן. אנו נדון כאן בתצורת ההערות הנפוצה יותר.

2. להגדיר עסקאות

אביב 3.1 מציג ה @EnableTransactionManagement ביאור שנוכל להשתמש בו ב- @תְצוּרָה מחלקה ואפשר תמיכה בעסקאות:

@Configuration @EnableTransactionManagement class class PersistenceJPAConfig {@Bean public LocalContainerEntityManagerFactoryBeans entityManagerFactoryBean () {// ...} @Bean Public PlatformTransactionManager transactionManager () {JpaTransactionManager transactionManager = JpaTransactionManager חדש; transactionManager.setEntityManagerFactory (entityManagerFactoryBean (). getObject ()); TransactionManager החזר; }}

למרות זאת, אם אנו משתמשים בפרויקט אתחול האביב ויש לנו תלויות קפיצי-נתונים- * או קפיצה-tx במסלול הכיתה, אז ניהול העסקאות יופעל כברירת מחדל.

3. קבע תצורה של עסקאות עם XML

לפני 3.1 או אם Java אינה אפשרות, הנה תצורת XML באמצעות מונע ביאורים ותמיכה במרחב השמות:

4. ה @ Transactional ביאור

עם תנועות מוגדרות, אנו יכולים כעת להוסיף הערה לשעועית @ Transactional ברמת הכיתה או השיטה:

@Service @ כיתה ציבורית Transactional FooService {// ...}

ההערה תומכת תצורה נוספת גם כן:

  • ה סוג התפשטות של העסקה
  • ה רמת בידוד של העסקה
  • א פסק זמן עבור הפעולה שעטפה העסקה
  • א קרא רק דגל - רמז לספק ההתמדה כי יש לקרוא את העסקה בלבד
  • ה גלגל לאחור כללים לעסקה

שים לב כי - כברירת מחדל, החזרה מתרחשת בזמן ריצה, חריגים לא מסומנים בלבד. החריג המסומן אינו מפעיל החזרה של העסקה. אנו יכולים, כמובן, להגדיר התנהגות זו עם ה- החזרה ו noRollbackFor פרמטרים של ביאור.

5. מלכודות פוטנציאליות

5.1. עסקאות ופרוקסי

ברמה גבוהה, האביב יוצר פרוקסי עבור כל הכיתות המאושרות @ Transactional - או בכיתה או באחת מהשיטות. ה- proxy מאפשר למסגרת להזרים לוגיקה טרנזאקטיבית לפני ואחרי שיטת הריצה - בעיקר לצורך התחלת העסקה וביצועה.

מה שחשוב לזכור הוא שאם שעועית העסקה מיישמת ממשק, כברירת מחדל ה- proxy יהיה Java Dynamic Proxy. פירוש הדבר שרק שיחות מתודה חיצוניות שנכנסות דרך ה- proxy ייורטו. כל שיחות קריאה עצמית לא יתחילו שום עסקה, גם אם לשיטה יש את @ Transactional ביאור.

אזהרה נוספת בשימוש ב- Proxy היא זו יש לציין רק שיטות ציבוריות @ Transactional. שיטות של נראות אחרת פשוט יתעלמו מההערה בשתיקה מכיוון שאלה אינן מקודמות.

מאמר זה דן כאן במלכודות נוספות בנושא פרוקסי.

5.2. שינוי רמת הבידוד

אנו יכולים גם לשנות את רמת בידוד העסקה:

@Transactional (בידוד = בידוד. SERIALIZABLE)

שימו לב שהדבר הוצג למעשה באביב 4.1; אם נריץ את הדוגמה שלעיל לפני אביב 4.1, זה יביא ל:

org.springframework.transaction.InvalidIsolationLevelException: JPA רגיל אינו תומך ברמות בידוד מותאמות אישית - השתמש במבצע מיוחד JpaDialect ליישום JPA שלך

5.3. עסקאות לקריאה בלבד

ה לקריאה בלבד בדרך כלל דגל מייצר בלבול, במיוחד בעבודה עם JPA; מג'אדוק:

זה רק משמש רמז לתת-מערכת העסקאות בפועל; זה יהיה לא בהכרח לגרום לכשל בניסיונות הגישה לכתיבה. מנהל עסקאות שלא יכול לפרש את הרמז לקריאה בלבד לֹא השליך חריג כאשר תתבקש לבצע עסקה לקריאה בלבד.

העובדה היא אנחנו לא יכולים להיות בטוחים שהוספה או עדכון לא יתרחשו כאשר ה- לקריאה בלבד דגל מוגדר. התנהגות זו תלויה בספק, ואילו JPA היא אגנוסטית של ספק.

חשוב גם להבין זאת ה לקריאה בלבד דגל רלוונטי רק בעסקה. אם פעולה מתרחשת מחוץ להקשר עסקי, פשוט מתעלמים מהדגל. דוגמה פשוטה לכך תקרא לשיטה המסומנת עם:

@Transactional (התפשטות = התפשטות. תומך, readOnly = נכון)

מהקשר שאינו עסקאות - לא תיווצר עסקה וה- לקריאה בלבד הדגל יתעלם.

5.4. רישום עסקאות

שיטה מועילה להבנת נושאים הקשורים לעסקאות היא כוונון עדין של רישום בחבילות העסקה. החבילה הרלוונטית באביב היא “org.springframework.transaction ", שיש להגדירו עם רישום רישום של TRACE.

6. מסקנה

סקרנו את התצורה הבסיסית של סמנטיקה טרנזאקטיבית באמצעות Java ו- XML, כיצד להשתמש @ Transactional ושיטות עבודה מומלצות של אסטרטגיית עסקאות.

כמו תמיד, הקוד המוצג במאמר זה זמין באתר Github.