Se o incremento automático não for bom o suficiente para suas necessidades, você pode criar um mecanismo de sequência atômica com n sequências nomeadas como esta:
Crie uma tabela para armazenar suas sequências:
CREATE TABLE sequence (
seq_name varchar(20) unique not null,
seq_current unsigned int not null
);
Supondo que você tenha uma linha para 'foo' na tabela, você pode obter atomicamente o próximo ID de sequência assim:
UPDATE sequence SET seq_current = (@next := seq_current + 1) WHERE seq_name = 'foo';
SELECT @next;
Sem necessidade de fechaduras. Ambas as instruções precisam ser executadas na mesma sessão, para que a variável local @next seja realmente definida quando a seleção acontecer.