Существует второе решение.
Используйте SERIALIZABLE
транзакции, которые выглядят следующим образом:
START TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT count(*) FROM man WHERE age = 80;
Теперь, если результат равен 0, продолжайте:
INSERT INTO man VALUES (80);
COMMIT;
Если две транзакции попытаются сделать это одновременно, одна из них завершится с ошибкой сериализации.
В этом случае вам просто нужно будет повторить попытку транзакции, пока она не завершится.
Выполнение сериализуемых транзакцийхуже, чем транзакции с более низким уровнем изоляции, но они все равно будут работать лучше, чем фактически сериализация транзакций.