הגדרת ההיקף בטרנזקציות של IndexedDB

מהו IndexedDB?

IndexedDB הוא תקן אינטרנט מתפתח לאחסון כמויות גדולות של נתונים מובְנים בדפדפן ולביצוע חיפושים יעילים בנתונים האלה באמצעות אינדקסים. במילים אחרות, IndexedDB הוא מאגר אובייקטים. הוא שונה ממסד נתונים יחסיים, שיש בו טבלאות עם שורות ועמודות של אוספים. זהו הבדל חשוב ומהותי שמשפיע על האופן שבו אתם מתכננים ובונים את האפליקציות שלכם (מידע נוסף זמין בעקרונות הבסיסיים).

אז מה חדש?

שינויים חברים שלי... יש לנו כמה שינויים שיגרמו לשגיאות אם לא נטפל בהם באמצעות שינוי תחביר פשוט.

החל מגרסה 17 ואילך, Chrome יגרום להצגת שגיאה אם עסקה ב-IndexedDB לא תוגדר להיקף של מאגר אובייקטים. מכיוון שכל הקריאה והכתיבה של נתונים מתבצעות בתוך עסקאות, אנחנו צריכים ליצור עסקה במסד נתונים, לציין את ההיקף (למשל, מאגרי האובייקטים שאתם רוצים לגשת אליהם) ולהחליט על סוג הגישה (קריאה בלבד או כתיבה).

מה המשמעות של זה בקוד? במקום להעביר מערך ריק ל-database.transaction:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

צריך לצמצם את ההיקף לאחסון אובייקטים מסוים או לרשימה של מאגרי אובייקטים:

// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);

// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
    IDBTransaction.READ_ONLY);

// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);

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

מקורות אחרים:

אז עד הפעם הבאה… המשיכו להרחיב את האתר לטריטוריות סמוכות.