-- le block DO est implicitement englobé par une transaction
BEGIN TRANSACTION;
DO $$
DECLARE v_balance integer;
BEGIN
    SELECT balance FROM account WHERE name = 'alice' INTO v_balance;

    -- la commande ci-dessous introduit une temporisation dans le block
    PERFORM clock_timestamp(),
    pg_sleep_for('3 seconds'),
    clock_timestamp();

    IF v_balance >= 750 THEN
        UPDATE account SET balance = balance - 750
        WHERE name = 'alice';

        UPDATE account SET balance = balance + 750
        WHERE name = 'bob';
    
        RAISE NOTICE '750€ transférés de alice vers bob';

    ELSE
        RAISE WARNING 'alice ne dispose que de %€ : transfert annulé', v_balance;
    END IF;

    -- ici on pourrait faire ROLLBACK ou COMMIT _dans_ le block
    -- et cela réouvrirait automatiquement une nouvelle transaction
END$$;
END TRANSACTION;