Conflict Resolution strategies
A conflict resolution strategy is used to resolve conflicts during Update and Delete Mutations respectively. In order to use a specific strategy, one has to specify it in the call to createDataSyncAPI
for every model that they want to use the strategy with:
Graphback DataSync has three built-in conflict resolution strategies that come with it:
#
ClientSideWinsThis strategy ensures that updates always resolve to whatever the client had sent, even in the event of a conflict. If the corresponding object has been deleted in the database, it is restored when the client tries to update it. For delete conflicts, the corresponding object is always deleted, regardless of if it had been updated since the client last fetched it.
#
ServerSideWinsThis strategy ensures that in the event of a update conflict, the client's update will never overwrite any field that has changed since the client last fetched it. If the object has been deleted in the database, the client will be notified of it by way of a ConflictError
. For delete conflicts, the client is informed of the conflict via a ConflictError
.
#
ThrowOnConflictThis strategy throws a ConflictError
whenever a client tries to change a field on a document, that has also been changed on the server since the client last fetched it.
#
Custom Conflict StrategyA custom conflict resolution strategy can be created by implementing ConflictResolutionStrategy. As an example, take the implementation of the ClientSideWins
strategy:
resolveUpdate
#
In the resolveUpdate
function, it can be seen that the resolved object's fields are always set to what the client updated in the event of an update conflict. It can also be seen that if the object has been deleted, it will be restored, along with the updates.
resolveDelete
#
In the resolveDelete
function, it can be seen that in the event of a delete conflict, the object is always deleted.
#
ConflictErrorThis error is thrown when a Conflict Resolution Strategy is unable to resolve the conflict, and needs the client to resolve it instead. It is a subclass of Error
with a conflictInfo
property which is of the ConflictMetadata
type. It can be created by passing a ConflictMetadata
object in it's constructor: