Monday, September 28, 2026

Dual-Write Async: Faster transactions, different failure risks

Dual-write integration between finance and operations apps and Dataverse

I have worked on projects where we have implemented dual-write synchronously. Microsoft has released dual-write async and having gone through the articles from Microsoft, I believe there are important design considerations to make before you use one-way or another.

Here I document:

  1. What these models are.
  2. When to consider one over the other.
  3. CRUD operation behavior of dual-write async.

Dual-write is normally expected to move data between finance and operations apps and Dataverse almost immediately.

That near-real-time behaviour is valuable, but it also connects the source transaction to the availability, validation rules and processing limits of the receiving application.

For high-volume transactions, this can become a problem.

A transaction containing one header and hundreds of lines might fail because of timeouts, transaction-size limits or the time required to validate every related record.

Dual-write async changes that behaviour by moving the data through an internal background-processing queue.

This can reduce pressure on the live transaction, but it introduces a different consistency and failure model.

It is not simply a faster version of dual-write.

Important: Always check Microsoft still documents dual-write async as a preview feature. Preview features are not intended for production use and might have restricted functionality.

Synchronous and asynchronous dual-write are different models

Standard dual-write provides tightly coupled, bidirectional and near-real-time integration between finance and operations apps and Dataverse.

With synchronous dual-write, the receiving application participates in the live transaction.

If a business validation fails in the receiving system, the originating transaction can also fail.

With dual-write async, the originating transaction and the integration transaction are separated.

Synchronous dual-writeDual-write async
Data is transferred as part of the live transactionData movement is processed in the background
The originating user might wait for the receiving systemThe originating transaction is decoupled
Errors can immediately block the transactionErrors might appear after the source transaction is committed
Both applications are expected to be consistent immediatelyThe applications become consistent after processing
Suitable when immediate cross-system consistency is requiredSuitable when a short synchronisation delay is acceptable

Async can improve the source-user experience, but it does so by accepting eventual consistency.

What eventual consistency means

Eventual consistency means the two applications might temporarily contain different information.

A record can be committed in Finance and Operations before the related record or update becomes available in Dataverse—or the other way around.

The background process then sequences and transfers the information.

This delay is acceptable only if the business process can continue safely while the two applications are temporarily different.

The correct question is therefore not:

Can this table use dual-write async?

It is:

Can the complete business transaction tolerate delayed consistency?

When dual-write async can be appropriate

Microsoft recommends considering entities that:

  • Belong to one grouped transaction
  • Have high transaction volumes
  • Contain header-and-line relationships
  • Regularly encounter synchronous transaction, timeout or size limits
  • Do not require the receiving application to respond before the source transaction completes

When delayed synchronisation is not acceptable

Dual-write async is a poor fit when the next business step depends on the other application already having the latest information.

Examples include:

  • A user creates an account in Dynamics 365 Sales and immediately creates a transaction in Finance and Operations
  • Dataverse requires an F&O-generated identifier before continuing
  • Credit validation depends on the latest customer balance
  • Pricing relies on the most recent product, trade agreement or currency information
  • Inventory availability must be accurate before confirming an order
  • A Field Service process immediately consumes an item in Supply Chain Management
  • An approval requires data written by the previous step
  • Automation in the receiving system must execute before the user continues

Do not mix synchronous and asynchronous entities in one transaction

This is one of the most important design rules.

If a business transaction contains a mixture of:

  • Entities configured for live synchronisation
  • Entities configured for dual-write async

the transaction fails.

Microsoft states that a transaction should contain either:

  • All asynchronous entities, or
  • All synchronous entities

The error identifies the entities that are incorrectly configured.

This means async should not be enabled one table at a time without understanding the complete transaction boundary.

Consider a transaction containing:

  • Order header
  • Order lines
  • Customer details
  • Delivery address
  • Charges

If the header and lines use async while another participating entity remains synchronous, the complete transaction can fail.

The design must follow the business transaction—not the individual map.

Deletes behave differently

Dual-write async currently supports only:

  • Create
  • Update

Delete operations do not use the async pipeline.

If a transaction contains a delete, the delete is processed through live synchronisation.

Microsoft treats deletes differently because removing dependent records under eventual consistency creates a greater risk of relationship and referential-integrity failures.

A solution architect should not assume that every operation for an async-enabled entity follows the same route.

Not every error can be retried

A common assumption is that anything processed asynchronously can simply be retried.

Dual-write async has several failure categories, and they behave differently.

Failure typeMeaningRetry behaviour
Application failureA business validation or logical rule rejected the transactionThe underlying data or configuration must be corrected
System failureAn unresolvable system or platform issue interrupted processingThe system can retry it
Concurrency failureThe queued record is no longer the latest versionThe record is skipped and cannot be retried
Conflict failureThe same record was changed in both applicationsThe configured primary system determines the winner

For a system failure, the retry processes the record only if its version is still the latest.

If newer changes exist, replaying an older version could overwrite more recent data. The platform therefore uses record versions to protect the current state.

Why concurrency failures are not retried

Imagine the following sequence:

  1. A customer record is updated in Finance and Operations.
  2. Version 1 is added to the async processing queue.
  3. Before version 1 is processed, the record is updated again.
  4. Version 2 becomes the latest version.
  5. The background process reaches version 1.

Processing version 1 could temporarily overwrite newer information.

The platform therefore skips the outdated version and categorises it as a concurrency failure.

This behaviour prevents phantom or out-of-sequence updates, but it also means that “retry everything” is not a valid operational procedure.

Support teams need to understand the failure category before deciding what action to take.

How conflicts are resolved

A conflict can occur when the same record is edited in both applications before the queued update is processed.

Dual-write async uses the primary for conflict detection configuration to decide which side wins.

For example, if Finance and Operations is configured as primary:

  • The Finance and Operations version overrides the Dataverse version.
  • The update from Dataverse to Finance and Operations is rejected.

Conflict detection is based on a snapshot of the record state—not simply on the time shown in a record’s modified date.

Microsoft notes that record timestamps cannot be relied upon because:

  • Not every record has an appropriate time field.
  • The clocks in both systems might not be coordinated.

Conflict failures also require special monitoring because Microsoft states that they are not shown in the normal synchronisation-errors experience. They are visible in a back-end table.

Entity sequencing still matters

Entities within an async group are processed using a defined sequence.

A lower sequence number receives a higher execution priority.

This is necessary for referential integrity.

For example:

  1. Customer
  2. Order header
  3. Order line

Processing the line before the header—or the header before the required customer—could cause the transaction to fail.

Async removes the requirement to process everything as part of the user’s live transaction. It does not remove entity dependencies.

The dependency graph and sequence must reflect the actual data relationships.

The queue does not contain a copy of the data

Dual-write async does not use the Data Import/Export Framework to export and import the records.

Its internal queues contain references used to manage and sequence data movement. They do not hold a separate copy of the business data.

This is another reason why record versions matter.

By the time the queue reference is processed, the underlying record might have changed again.

Note: Dual-write async is event-driven and not scheduled driven, even though the data movement happens in the background.

A practical architecture example

Consider an order-entry process with one order header and 300 lines.

With synchronous dual-write:

  1. The user saves the order.
  2. All related records are transferred during the live transaction.
  3. Dataverse validations and platform limits participate in the save.
  4. A timeout or validation error can reject the source transaction.

With async dual-write:

  1. The user saves the order.
  2. The source transaction commits.
  3. References to the header and lines enter the processing queue.
  4. The background process applies sequencing and dependencies.
  5. Dataverse receives the records after the source transaction has completed.

The user might experience a faster save.

However, the order might not immediately be available to a Dataverse-based customer-service process. If one line fails a business validation, the support team must manage that failure after the user’s original transaction has already succeeded.

The performance benefit therefore comes with an operational cost.

Final thoughts

The most important design rule is simple:

Do not enable async because an individual table is slow. Enable it only when the complete business transaction can safely operate with eventual consistency.

For a process that depends on immediate cross-application validation, async can replace a performance problem with a consistency problem.

Official documentation:

 

No comments:

Post a Comment