The default durability mode in IndexedDB is changing from strict
to relaxed
from Chrome 121. This adjustment is to enhance performance and to align with other major browsers like Firefox and Safari. The blog post explains the details of this change and what it means for web developers.
IndexedDB durability modes
IndexedDB, a powerful web API for storing large amounts of structured data, offers two durability modes for readwrite
transactions:
strict
: this mode explicitly instructs the OS to flush changes to disk before issuing thecomplete
event.relaxed
this mode relies on default OS flushing behavior and issues thecomplete
event after changes make it to the OS buffer, which is typically flushed every couple seconds.
It's important to note that strict
does not ensure that changes are actually written immediately to disk. After a site calls put()
, there's still some finite amount of time during which a power failure could cause the change to not make it to disk and therefore be missing the next time the app runs.
When it comes to guarantees with strict
durability, the IndexedDB transaction complete
event is not fired until after the data is actually written, whereas with relaxed
durability, the data is still in the process of being written when the complete
event fires. (For more details about the full process, check this explainer).
So strict
is really only for operations where you absolutely need to know it was written before you do the next thing. Data migration is an example where strict
durability is required. When moving from one backing store to another, you don't want to delete the old format until the new one is written. This way, strict
durability facilitates a migration routine that could recover from a failure halfway through.
The default durability mode change
The crucial aspect of this change is the default durability mode for readwrite
transactions in Chrome. Until now, the default was strict
, ensuring immediate disk writes for data changes. However, due to performance considerations and to align with other major browsers which all use relaxed
, Chrome likewise plans to change the default to relaxed
.
This change is designed to provide a better balance between performance and data durability. While strict
ensures maximum data durability, relaxed
is often sufficient for many web applications and can significantly improve performance in the following ways
- Speed—in real-world examples, the Chrome team saw speed improvements between a factor of 3 and 30.
- Disk durability, particularly for devices with a Solid State Disk (SSD).
- Extended battery life.
- An improvement in read speed. Due to the architecture of IndexedDB, where read transactions are often blocked behind write transactions, read speed is improved as a secondary effect.
- The entire device is positively affected, because disk operations are a shared system resource.
Interoperability and compatibility
One important aspect of this change is its impact on interoperability and compatibility. By aligning with the behavior of other major browser vendors, Chromium improves interoperability. The standard itself allows for different implementations, and this change aims to harmonize those implementations. You can find more historical context on this change in this GitHub Issue.
What does this mean for web developers?
This change doesn't introduce any new API surface. The existing IndexedDB API remains the same, and this change primarily affects the default behavior of readwrite
transactions. You can specify your preferred durability mode when creating transactions, giving you control over data durability and performance. The following code sample shows how to get the old behavior back, by setting durability
to strict
in the optional options array.
let db;
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
db = DBOpenRequest.result;
};
const transaction = db.transaction(
['toDoList'],
'readwrite',
{ durability: 'strict' });
Testing the change locally before it ships
The change will go into effect in Chrome 121. If you want to test the new behavior locally before, toggle the #indexed-db-default-durability-relaxed
flag in chrome://flags
.
Learn More
For more technical details and updates on this change, check the tracking bug and the Chrome Platform Status entry.
In summary, Chrome's move to change the default durability mode in IndexedDB aims to improve performance while maintaining compatibility with other major browsers. In the majority of cases, our recommendation is to do nothing, as the new default will provide performance enhancements. If required, you can continue to specify your preferred durability mode, taking control over data durability and performance in your web applications.
Acknowledgements
This article was reviewed by Evan Stade and Rachel Andrew.