$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);
Ver mysqli_insert_id()
.
Haga lo que haga, no inserte y luego haga "SELECT MAX(id) FROM mytable ". Como dices, es una condición de carrera y no hay necesidad. mysqli_insert_id() ya tiene esta funcionalidad.
Otra forma sería ejecutar ambas consultas a la vez y usar MySQL LAST_INSERT_ID() método, donde ambas tablas se modifican a la vez (y PHP no necesita ningún ID), como:
mysqli_query($link, "INSERT INTO my_user_table ...;
INSERT INTO my_other_table (`user_id`) VALUES (LAST_INSERT_ID())");
Nota que cada conexión realiza un seguimiento de la identificación por separado (por lo tanto, los conflictos ya se evitan).