Here's a scenario where you can potentially run into double-spend issues:
- Create two copies of a brand new wallet.dat file running one on each of two computers (copy_A and copy_B)
- Send a single transaction of 2 BTC to a single address that exists in both copies of the wallet
- Wait for the transaction to get 6 confirmations
- Put copy_A into an offline state (disconnect the network cable, turn off the computer, or simply shut down the Bitcoin-Qt software)
- Keep copy_B online
- Wait a few days so that the blockchain in copy_A falls behind on synchronization
- Send a 0.5 BTC transaction from copy_B to some other address that is not part of these two wallets
- See that the balance on copy_B has dropped to 1.5 BTC
- Bring copy_A online
- See that the balance on copy_A is still 2 BTC
- Send a transaction from copy_A to some other address that is not part of these two wallets before copy_A catches up in synchronization
This process will result in a double-spend problem in copy_A. It will reduce the balance in copy_A, and will show the transaction in the transaction list, but it will never confirm.
So if you have 2 copies of the same wallet.dat (at least; the same when originally copied), it is possible to lose Bitcoins this way. Wow, that's news to me. I've been using 2 copies of my wallet.dat for a long time now and never noticed any issues.
In that scenario would an older backup of wallet.dat regain those lost Bitcoins by simply letting it synchronize? Or does the other copy receive the same transaction and lose the Bitcoins as well?
Is it always perfectly safe to use 2 copies if you wait for complete synchronization before sending any Bitcoins to anyone? (This is what I've done till now)
If you don't wait for complete synchronization, you won't lose bitcoins. You'll just end up with a double spend that will never confirm. Then you'll have to use a tool like pywallet to fix the wallet.
The real issue arises after you've sent about 100 transactions without replacing one copy of the wallet.dat with the other. This problem is due to the way Bitcoin-Qt handles address generation and transaction change. It won't matter if the blockchain is fully synchronized or not. At that time you'll have exhausted the pre-generated address pool, and you'll start to see extra bitcoins disappear out of the wallets. The problem can be resolved safely if you are careful and know what you are doing.