**Apache Airflow version**:
2.0.1

**Kubernetes version (if you are using kubernetes)** (use `kubectl version`):
Not applicable

**Environment**:

- **Cloud provider or hardware configuration**: None
- **OS** (e.g. from /etc/os-release): Ubuntu
- **Kernel** (e.g. `uname -a`): 
- **Install tools**:
- **Others**:

**What happened**:

1. Ran airflow db init on mysql in parallel in 2 command lines. Only one command did the migrations, the other one waited. But connections were inserted twice. I would like them not to be added twice.
2. Ran airflow db init on postgres in parallel in 2 command lines. Both command lines started doing migrations on the same db in parallel. I would like one command to run, the other to wait.

**What you expected to happen**:

1. For MySQL. Connections and other config objects to be inserted only once.
2. For Postgres. Only one migration can be performed in the same time for the same db.

**How to reproduce it**:
Scenario 1:
Setup Airflow so that it uses MySQL.
Run `airflow init db` in 2 command lines, side by side.

Scenario 2:
Setup Airflow so that it uses Postgres.
Run `airflow init db` in 2 command lines, side by side.

**Anything else we need to know**:
This problem occurs every time.
airflow/utils/db.py
"""
    Function to wait for all airflow migrations to complete.
    :param timeout: Timeout for the migration in seconds
    :return: None
    """
    from alembic.runtime.migration import MigrationContext
    from alembic.script import ScriptDirectory
    config = _get_alembic_config()
    script_ = ScriptDirectory.from_config(config)
    with settings.engine.connect() as connection:
        context = MigrationContext.configure(connection)
        ticker = 0
        while True:
            source_heads = set(script_.get_heads())
            db_heads = set(context.get_current_heads())
            if source_heads == db_heads:
                break
            if ticker >= timeout:
                raise TimeoutError(
                    f"There are still unapplied migrations after {ticker} seconds. "
                    f"Migration Head(s) in DB: {db_heads} | Migration Head(s) in Source Code: {source_heads}"
                )
            ticker += 1
            time.sleep(1)
            log.info('Waiting for migrations... %s second(s)', ticker)
def check_conn_id_duplicates(session=None) -> str: