The goal product-wise is to ensure intention preservation, but that is hard to achieve in general as intention is tied to what the product does.
For instance, if you have an integer and an increment operation, say, in a HN-like app to track upvotes. If your synchronization simply resets modified values with a newest-win approach, the following situation would lose an upvote: you have 5 upvotes, A and B both upvote you simultaneously, each setting the number of upvotes to 6. The server tells A that the number of upvotes has been set to 6, then tells B the same thing, and they are both happy. However, product-wise, it should have been 7 instead.
[
{ts: <upvoted_time>, author: <id_of_author>. action: 'up'},
{ts: <upvoted_time>, author: <id_of_author>, action: 'down'},
{ts: <upvoted_time>, author: <id_of_author>, action: 'up'}
]
You can sync from the server the changes after a certain timestamp, and the client can calculate the accurate value.That is why Google's TrueTime API (introduced in Spanner[0]) is such a big deal.
[0]: http://static.googleusercontent.com/external_content/untrust...