A READ COMMITTED (the default isolation level) transaction will acquire a new snapshot for each query. In a READ ONLY transaction, could you not just omit the transaction entirely and have no real difference in behaviour?
You can’t use SELECT … FOR UPDATE, but you can use LOCK [TABLE], which would last until unlocked or the transaction ends. So there’s one difference. Are there other differences?