I have set up a private ethereum blockchain and I have defined a new coin. When I send coins from one account to another through the smart contract the transaction is always mined even when the coins are not moved. Is there a way to use the blockchain data to verify if a transaction made permanent changes or not?
Since byzantinum fork checking the status field in your transaction receipt should indicate if the transaction have failed or succeeded (Unless there's a bug in your contracts).
Before byzantinum fork there wasn't a direct way to ensure the transaction has succeeded; a common trick was to check that gasUsed < gas to indicate the transaction finished correctly (to be really sure you have to trace the transaction execution).