At university we learn that transactions should be serializable and that they are meant for these exact cases.
Transactions aren't actually true transactions unless they are serializable.
Most databases don't actually default to serializable transactions, but instead try to get close by implementing snapshot isolation. These aren't true transactions, since snapshot isolation doesn't truly isolate transactions.
The article had a bunch of nice ways to get better isolation than snapshot for a bunch of special cases. These are all very nice, since they can be useful for mainting performance together with integrity.
My professors at university still laugh at commercial databases and calls them toys for still not having implemented more efficient serializable transactions.