Note: some journalled filesystems will just refuse to mount if they can't
do their journal replay (e.g. Reiser 3.6).

If you have a disk that you need to be absolutely sure will not be written
to, mount -o ro isn't strong enough -- journalled filesystems will often
still do a log replay and write changes to disk.

But, you can

losetup /dev/loopX /dev/your-device -r

Then mount the loop device. Writes will just return "denied".