הפעלת מנעולי עסקאות ב- JPA של נתוני אביב

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

במדריך מהיר זה נדון בהפעלת נעילת עסקאות ב- Spring Data JPA עבור שיטות שאילתה מותאמות אישית ושיטות CRUD של מאגר מוגדר מראש.

אנו נבחן גם סוגי נעילה שונים וקביעת פסק זמן לנעילת עסקאות.

2. סוגי נעילה

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

2.1 נעילה פסימית

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

2.2 נעילה אופטימית

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

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

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

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

3. הפעלת נעילת עסקאות בשיטות שאילתה

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

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

כדי לציין נעילה בשיטת שאילתה מותאמת אישית של מאגר נתונים של Spring Data JPA, נוכל להוסיף הערה לשיטה באמצעותה @לנעול וציין את סוג מצב הנעילה הנדרש:

@Lock (LockModeType.OPTIMISTIC_FORCE_INCREMENT) @Query ("בחר c מלקוח c WHERE c.orgId =? 1") רשימה ציבורית fetchCustomersByOrgId (ארוך orgId);

לאכיפת הנעילה על שיטות מאגר מוגדרות מראש כגון מצא הכל אוֹ findById (id), עלינו להכריז על השיטה במאגר ולהביא הערה לשיטה באמצעות ה- לנעול ביאור:

@Lock (LockModeType.PESSIMISTIC_READ) public findById אופציונלי (CustomerId ארוך);

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

במקרה שלא ניתן להעניק את הנעילה והתנגשות הנעילה אינה גורמת להחזרת עסקה, JPA זורק א LockTimeoutException. אבל זה לא מסמן את העסקה הפעילה להחזר.

4. הגדרת פסק זמן לנעילת עסקה

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

ב- Spring Data JPA, ניתן להגדיר את פסק הזמן לנעילה באמצעות ה- QueryHints ביאור על ידי הצבת א QueryHint על שיטות שאילתה:

@Lock (LockModeType.PESSIMISTIC_READ) @QueryHints ({@ QueryHint (name = "javax.persistence.lock.timeout", value = "3000")}) ציבורי findById (Long customerId) אופציונלי;

פרטים נוספים על הגדרת רמז לפסק זמן הנעילה בהיקפים שונים ניתן למצוא במאמר ObjectDB זה.

5. מסקנה

במדריך זה למדנו את הסוגים השונים של מצבי נעילת עסקאות. למדנו כיצד לאפשר נעילת עסקאות ב- Spring Data JPA. סקרנו גם הגדרת פסק זמן לנעילה.

החלת מנעולי העסקה הנכונים במקומות הנכונים יכולה לסייע בשמירה על שלמות הנתונים ביישומי שימוש בו זמנית בנפח גבוה.

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

כמובן שקוד הדוגמה לנעילה פסימית וגם לנעילה אופטימית ניתן למצוא ב- Github.