as far as i know, it could be an issue with utxo. once a transaction gets into the network (often mempool) it’s verified on double-spending with both current transactions in mempool and blockchain data.
Let me give an example that a tx could be in mempool and got rejected to be picked into a block then removed from mempool by timeout:
2 txs A and B created from the same account X, tx A used an utxo O going to mempool then a shard for producing a new block but not confirmed yet, after that tx B used utxo O as well going to mempool, it’s also passed double-spending validation since O was not used in mempool and blockchain at that point because tx A left mempool but not got confirmed in a block yet. When tx A got confirmed in a block and O was stored into blockchain, tx B would be rejected from producing a new block due to utxo O double-spending in blockchain - it’s kept rejecting tx B until timeout.
The same situation could happen if you send multiple txs to different fullnode concurrently from the same account.
One solution for the issue is marking used/pending utxo at the client side so that txs are only created with “un-used” utxo.