PostgreSQL defaults to read committed and MySQL defaults to repeatable read. What does a plain SELECT actually see differently under each engine's default, and where does a service moved between them tend to break?
Under PostgreSQL's default (read committed), each statement inside a transaction takes a fresh snapshot, so two SELECTs of the same row several statements apart can return different values if another transaction committed a change in between. Under MySQL's default (repeatable read), the whole transaction takes one snapshot at its first read and every plain SELECT keeps returning that same snapshot's values for the rest of the transaction — but a locking read (SELECT ... FOR UPDATE, or an UPDATE/DELETE) reads the latest committed data instead, so a plain read and a locking read of the same row inside one MySQL transaction can legitimately disagree. A service that assumes 'repeated reads inside a transaction stay consistent' breaks when moved onto PostgreSQL at its default, and a service that assumes 'every read reflects concurrent commits immediately' breaks when moved onto MySQL at its default.