I encountered this problem and agree with most of the diagnosis. The real problem is that sqlite assumes it "owns" the temporary transaction file that it created, and can do anything it wants with it; for example read, rename, or delete it. Any other process which gets it's hooks into the file can obviously invalidate this assumption.
Programs that agressively interfere, such as virus scanners and tortoise, make the problem obvious, but many legitimate but infrequent processes - such as file system backup - could cause rare and impossible to diagnose random failures. The obvious quick fix is to retry these file operations that must succeed, but the underlying problem is a fundamental one that deserves to be addressed.