mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-04 07:10:06 +08:00
ea76b7c442
Summary: Until now, we've been hiding transactions beneath the surface. When you call persistModel, you're implicitly creating a transaction. You could explicitly create them with `atomically`..., but there were several critical problems that are fixed in this diff: - Calling persistModel / unpersistModel within a transaction could cause the DatabaseStore to trigger. This could result in other parts of the app making queries /during/ the transaction, potentially before the COMMIT occurred and saved the changes. The new, explicit inTransaction syntax holds all changes until after COMMIT and then triggers. - Calling atomically and then calling persistModel inside that resulted in us having to check whether a transaction was present and was gross. - Many parts of the code ran extensive logic inside a promise chained within `atomically`: BAD: ``` DatabaseStore.atomically => DatabaseStore.persistModel(draft) => GoMakeANetworkRequestThatReturnsAPromise ``` OVERWHELMINGLY BETTER: ``` DatabaseStore.inTransaction (t) => t.persistModel(draft) .then => GoMakeANetworkRequestThatReturnsAPromise ``` Having explicit transactions also puts us on equal footing with Sequelize and other ORMs. Note that you /have/ to call DatabaseStore.inTransaction (t) =>. There is no other way to access the methods that let you alter the database. :-) Other changes: - This diff removes Message.labels and the Message-Labels table. We weren't using Message-level labels anywhere, and the table could grow very large. - This diff changes the page size during initial sync from 250 => 200 in an effort to make transactions a bit faster. Test Plan: Run tests! Reviewers: juan, evan Reviewed By: juan, evan Differential Revision: https://phab.nylas.com/D2353 |
||
---|---|---|
.. | ||
components | ||
fixtures | ||
models | ||
services | ||
stores | ||
tasks | ||
action-bridge-spec.coffee | ||
auto-update-manager-spec.coffee | ||
buffered-process-spec.coffee | ||
clipboard-spec.coffee | ||
component-registry-spec.coffee | ||
database-object-registry-spec.coffee | ||
database-view-spec.coffee | ||
dom-utils-spec.coffee | ||
extension-registry-spec.coffee | ||
jasmine-helper.coffee | ||
jasmine-jquery.js | ||
jasmine.js | ||
launch-services-spec.coffee | ||
menu-manager-spec.coffee | ||
model-view-selection-spec.coffee | ||
model-view-spec.coffee | ||
module-cache-spec.coffee | ||
n1-spec-reporter.coffee | ||
nylas-api-spec.coffee | ||
nylas-env-spec.coffee | ||
nylas-protocol-handler-spec.coffee | ||
nylas-test-utils.coffee | ||
package-manager-spec.coffee | ||
package-spec.coffee | ||
quoted-html-transformer-spec.coffee | ||
quoted-plain-text-transformer-spec.coffee | ||
spec-bootstrap.coffee | ||
spec-helper-platform.coffee | ||
spec-helper.coffee | ||
spec-suite.coffee | ||
spellchecker-spec.coffee | ||
style-manager-spec.coffee | ||
styles-element-spec.coffee | ||
theme-manager-spec.coffee | ||
time-override.coffee | ||
time-reporter.coffee | ||
undo-manager-spec.coffee | ||
utils-spec.coffee |