Most ethereum nodes will put tx's from a particular address into a queue, with increasing unique nonces. tx's with larger nonces will not be sent as long as tx's with smaller nonces are pending.
In the past, when I was able to run my own geth node and submit tx's to that, occasionally pending tx's would get stuck forever like you describe on mainnet or morden (I've never been able to use ropsten b/c of slow mining times). The way I solved that was to reboot the geth node, and resubmit the tx's.
For example, if you were to start a Goerli testnet locally (which I highly recommend for its small size and speed)
geth --goerli --syncmode=light --rpcaddr=0.0.0.0
Then connected with a geth console, you can use the txpool
module to inspect any pending transactions sent from your node. You can even connect to your local node from Metamask, and use it to submit tx's.
$ geth attach --datadir ~/Library/Ethereum/goerli
Welcome to the Geth JavaScript console!
instance: Geth/v1.9.4-stable-46891c12/darwin-amd64/go1.13.1
at block: 1393409 (Tue, 01 Oct 2019 04:48:27 EDT)
datadir: /Users/ppham/Library/Ethereum/goerli
modules: admin:1.0 debug:1.0 eth:1.0 les:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0
> txpool
{
content: {
pending: {},
queued: {}
},
inspect: {
pending: {},
queued: {}
},
status: {
pending: 0,
queued: 0
},
getContent: function(callback),
getInspect: function(callback),
getStatus: function(callback)
}
Hope that is helpful or at least interesting.