This is not true in postgres. When the second transaction tries to update the row, it will wait for the first transaction to commit first and then recheck the WHERE.
https://www.postgresql.org/docs/current/transaction-iso.html...
https://www.postgresql.org/docs/current/transaction-iso.html...
Why would both transactions see `used = 0`? The DB server tries to isolate transactions and actively hides effects of other transactions that have not committed yet.