Deberías leer sobre Transacciones, que eso es lo que estás viendo.
Una transacción, en jerga databasera, es una secuencia de consultas que se realizan en bloque, de tal forma que o se realizan todas o no se realiza ninguna.
Normalmente comienza con BEGIN y termina con COMMIT (para guardar los cambios) o ROLLBACK (para descartarlos). Hace ya varios años escribí un artículo al respecto, espero que te pueda aclarar un poco el asunto:
http://blog.elcodiguero.com/mysql/8-...-en-mysql.html
No sé qué has hecho en el medio entre el insert sin commit y el insert con commit, pero supongo que descartaste la sesión (de otra forma, sería igual al caso donde insertaste los id 4 y 5), y eso hizo un rollback automático, o quizás estás haciendo las cosas desde dos sesiones diferentes a la BBDD.
Yo diría que el primer commit tomó y reservó el ID 5, y eso fue considerado por el segundo aunque el primero no estuviese guardado. Si fuese de otra forma, el segundo también tendría ID 5, y al guardarlos a ambos terminarías con un error de datos: dos registros con el mismo ID o un error de consistencia al guardar uno de los registros.
De nuevo, lee sobre transacciones para entenderlo mejor, lo que ves no es un comportamiento extraño.
Lo que te sugiere razpeitia es el uso de "Prepared Statements": consultas parametrizadas de tal forma que es el motor de base de datos el que se encarga de colocar correctamente los valores en la consulta. Esto evita, por sí mismo, un montón de problemas de seguridad que uno puede crear sin querer al escribir la consulta concatenando los valores.
Saludos.