Ну тут скорее даже вопрос не в удержании блокировки, а когда именно мы берем значение счетчика. Насколько я помню, нарушение внешнего ключа, например, не берет счетчик. Т.е. наверное можно было сначала полочить дырки в уникальном индексе, а уже потом брать инкремент, да?
чтобы вставить запись, нужно её сформировать. в том числе, получить следующее значение auto_increment. можно получить значение N и позволить параллельным транзакциями получать значения N+1, N+2, ... Но да, если при вставке получили duplicate key, на месте N будет "дырка". А можно было бы не давать параллельным транзакциям получать N+1, N+2, а заставить их ждать, пока мы полностью не выполним вставку и не откатимся из-за duplicate key. Тогда первая ожидающая транзакция получила бы значение N, дырки бы не было, но это ужасно неэффективно. Так понятнее, надеюсь