Based on earlier discussion we concluded that the duplicate rows for transactions sub-tables were generated by some bug in past while there was no atomic block write, and carried forward in all snapshots.
Since after the atomic block write its not possible to have such scenario, where block processing failed, and re-processing same block caused duplicate rows. So we can just clean the db once manually before taking snapshot and will be good to go.
As @webmaster128 suggested we can add `UNIQUE` constraint to all `transactionId` columns in all transaction sub-tables e.g. transfer, vote etc just to have an additional safety check in place.