Thay đổi đối với chế độ độ bền mặc định trong IndexedDB

Chế độ độ bền mặc định trong IndexedDB sẽ thay đổi từ strict thành relaxed từ Chrome 121. Việc điều chỉnh này nhằm nâng cao hiệu suất và điều chỉnh cho phù hợp với các trình duyệt lớn khác như Firefox và Safari. Bài đăng trên blog giải thích chi tiết về thay đổi này và ý nghĩa của thay đổi đối với nhà phát triển web.

Chế độ độ bền của IndexedDB

IndexedDB, một API web mạnh mẽ để lưu trữ lượng lớn dữ liệu có cấu trúc, cung cấp hai chế độ durability (mức độ bền vững) cho các giao dịch readwrite:

  • strict: chế độ này hướng dẫn rõ ràng cho hệ điều hành để xoá các thay đổi vào ổ đĩa trước khi phát hành sự kiện complete.
  • relaxed chế độ này dựa vào hành vi xả mặc định của hệ điều hành và phát hành sự kiện complete sau khi các thay đổi được đưa vào vùng đệm hệ điều hành, thường được xả vài giây một lần.

Điều quan trọng cần lưu ý là strict không đảm bảo rằng các thay đổi thực sự được ghi ngay vào ổ đĩa. Sau khi một trang web gọi put(), vẫn có một khoảng thời gian hữu hạn trong đó sự cố mất điện có thể khiến thay đổi không được lưu vào ổ đĩa và do đó sẽ bị thiếu trong lần chạy ứng dụng tiếp theo.

Khi nói đến việc đảm bảo độ bền strict, sự kiện complete giao dịch IndexedDB sẽ không được kích hoạt cho đến sau khi dữ liệu thực sự được ghi, trong khi với độ bền relaxed, dữ liệu vẫn đang trong quá trình ghi khi sự kiện complete kích hoạt. (Để biết thêm thông tin chi tiết về toàn bộ quy trình, hãy xem nội dung giải thích này).

Vì vậy, strict thực sự chỉ dành cho các thao tác mà bạn cần phải biết rằng thao tác đó đã được ghi trước khi thực hiện thao tác tiếp theo. Di chuyển dữ liệu là một ví dụ về trường hợp cần có độ bền của strict. Khi di chuyển từ bộ nhớ sao lưu này sang bộ nhớ sao lưu khác, bạn không nên xoá định dạng cũ cho đến khi ghi định dạng mới. Bằng cách này, độ bền của strict sẽ tạo điều kiện cho một quy trình di chuyển có thể khôi phục sau khi gặp lỗi ở giữa quá trình.

Thay đổi chế độ độ bền mặc định

Khía cạnh quan trọng của thay đổi này là chế độ độ bền mặc định cho các giao dịch readwrite trong Chrome. Cho đến nay, giá trị mặc định là strict, đảm bảo ghi ổ đĩa ngay lập tức cho các thay đổi về dữ liệu. Tuy nhiên, do cân nhắc về hiệu suất và để phù hợp với các trình duyệt lớn khác đều sử dụng relaxed, Chrome cũng dự định thay đổi giá trị mặc định thành relaxed.

Thay đổi này được thiết kế để mang lại sự cân bằng tốt hơn giữa hiệu suất và độ bền của dữ liệu. Mặc dù strict đảm bảo độ bền tối đa của dữ liệu, nhưng relaxed thường là đủ cho nhiều ứng dụng web và có thể cải thiện đáng kể hiệu suất theo những cách sau

  • Tốc độ – trong các ví dụ thực tế, nhóm Chrome nhận thấy tốc độ cải thiện từ 3 đến 30 lần.
  • Độ bền của ổ đĩa, đặc biệt là đối với các thiết bị có Ổ đĩa thể rắn (SSD).
  • Kéo dài thời lượng pin.
  • Cải thiện tốc độ đọc. Do cấu trúc của IndexedDB, trong đó các giao dịch đọc thường bị chặn sau các giao dịch ghi, nên tốc độ đọc được cải thiện như một hiệu ứng phụ.
  • Toàn bộ thiết bị sẽ chịu ảnh hưởng tích cực vì các thao tác trên ổ đĩa là tài nguyên hệ thống dùng chung.

Khả năng tương tác và tương thích

Một khía cạnh quan trọng của thay đổi này là tác động của nó đến khả năng tương tác và khả năng tương thích. Bằng cách điều chỉnh theo hành vi của các nhà cung cấp trình duyệt lớn khác, Chromium cải thiện khả năng tương tác. Bản thân tiêu chuẩn này cho phép nhiều cách triển khai và thay đổi này nhằm điều chỉnh những cách triển khai đó. Bạn có thể tìm hiểu thêm về bối cảnh trước đây của thay đổi này trong Vấn đề này trên GitHub.

Điều này có ý nghĩa gì đối với nhà phát triển web?

Thay đổi này không giới thiệu bất kỳ nền tảng API mới nào. API IndexedDB hiện tại vẫn giữ nguyên và thay đổi này chủ yếu ảnh hưởng đến hành vi mặc định của các giao dịch readwrite. Bạn có thể chỉ định chế độ độ bền ưu tiên khi tạo giao dịch, nhờ đó kiểm soát được độ bền và hiệu suất của dữ liệu. Mã mẫu sau đây cho biết cách khôi phục hành vi cũ bằng cách đặt durability thành strict trong mảng tuỳ chọn không bắt buộc.

let db;
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
  db = DBOpenRequest.result;
};
const transaction = db.transaction(
  ['toDoList'],
  'readwrite',
  { durability: 'strict' });

Thử nghiệm thay đổi cục bộ trước khi phát hành

Thay đổi này sẽ có hiệu lực trong Chrome 121. Nếu bạn muốn kiểm thử hành vi mới trên máy trước, hãy bật/tắt cờ #indexed-db-default-durability-relaxed trong chrome://flags.

Tìm hiểu thêm

Để biết thêm thông tin kỹ thuật và thông tin cập nhật về thay đổi này, hãy xem lỗi theo dõimục Trạng thái của nền tảng Chrome.

Tóm lại, việc Chrome thay đổi chế độ độ bền mặc định trong IndexedDB nhằm cải thiện hiệu suất trong khi vẫn duy trì khả năng tương thích với các trình duyệt lớn khác. Trong hầu hết các trường hợp, bạn không cần làm gì cả vì giá trị mặc định mới sẽ giúp cải thiện hiệu suất. Nếu cần, bạn có thể tiếp tục chỉ định chế độ độ bền ưu tiên, kiểm soát độ bền và hiệu suất của dữ liệu trong các ứng dụng web.

Lời cảm ơn

Bài viết này đã được Evan StadeRachel Andrew xem xét.