Imagine a banking app with two accounts and a rule that their combined balance must stay at or above zero. Each account holds 100, so the pair holds 200. Transaction A reads both balances, sees 200 total, and withdraws 150 from account one. At the same time transaction B reads both balances, also sees 200, and withdraws 150 from account two. Each transaction checked the rule and believed it was safe.
Under a weaker isolation level both can commit, leaving account one at minus 50 and account two at minus 50, a combined minus 100 that violates the invariant. This is write skew, and it is invisible to each transaction because the two transactions wrote different rows, so there was no write conflict to catch. Under serializability the database recognizes that no serial order of A and B could produce this outcome, so it aborts one of them. The application catches the serialization failure, retries, and now reads the already-reduced balance and correctly refuses the second withdrawal.
PostgreSQL handles exactly this case with SSI. The key engineering takeaway is that serializability moves the burden of getting concurrency right from your application code into the database, in exchange for accepting that some transactions will be told to try again.