Como gerar a numeração sequencial para boleto

Boa noite pessoal, sou iniciante em PHP e tenho uma duvida relacionada a como gerar a numeração sequencial de um boleto para não haver conflito!

O sistema está funcionando da seguinte maneira o usuário gera o boleto o script faz a seguinte consulta:
SELECT MAX(id)+1 as id FROM boletos;
e retorna a numeração do próximo boleto, mas minha duvida é caso dois usuários realizem a geração do boleto ao mesmo tempo o sistema retorna o erro da API com numeração do boleto repetida, como posso solucionar este problema para que caso duas pessoas estejam gerando o boleto ao mesmo tempo o sistema gere outra numeração para ele?

Se for acessar multiusário: SELECT MAX(id)+1 as id FROM boletos; não é uma boa ideia.
Utilize um campo em uma tabela empresas ou parâmetros, salvando +1 a cada boleto.

Haroldo o problema que vi foi o seguinte nesse método que me passou, vamos supor que tenho uma tabela “id_boletos” a qual existe um campo de nome “id” com AUTO_INCREMENT e toda vez que for chamar a API para gerar um boleto gero esse id, e duas pessoas estão gerando ao mesmo tempo, caso o de uma pessoa dê erro na API devido aos campos, esse numero vai ser inutilizável visto que, não seria mais o ultimo e perderia o id em questão!

Na verdade não é um campo id autoincremento.

Você vai incrementa lo manualmente, é somente se, o retorno da api for válido.

Se o banco de dados é postgres em mi caso…
Sugiro criar uma função no banco de dados que retorne o ID a partir de

RETURN (SELECT coalesce(MAX(id),0)+1 FROM boletos);

Assim todos os utilizadores chamam esta função sempre que se necessite do ID

Continuaria com problema de multi usuário

Caro, se vc gera o ID no momento de gerar o boleto e gravar não deve ter problema. Sempre que vc vai gravar numa tabela o Postgres bloqueia a mesma (bloqueio implícito). Agora se vc gera o ID e não usa o mesmo dando tempo a que outra pessoa gere novamente é outro ID seria outra coisa.
Alias, como eu considero melhor seria assim: Deve-se gerar o ID dentro dum procedimento armazenado ou função do banco de dados e criar boleto de forma automática dentro deste procedimento armazenado já que o mesmo constitui de por sim uma transação, desta forma garante que outra pessoa não consiga gerar ID até concluir o processo anterior.

Referência de Bloqueios:

Sim, aqui utilizo o MySQL, não tenho conhecimento sobre essa função, mas como preciso do ID para enviar para a API fiz solicitando que caso a API retorne o erro de nosso numero já existe, refazer a consulta e adicionar o próximo numero, assim não terá perdas do numero, mas caso o sistema tenha muitas gerações simultâneas acredito que iria ocorrer o problema de apresentar o erro de Nosso Numero já existe mesmo refazendo o envio com outro numero na segunda vez!

Caro, eu não uso MySQL mas garanto que ele também permite a criação de procedimentos armazenados ou funções, as mesmas devem ser criadas por ti como desenvolvedor ou administrador do banco de dados.
Em cada um destes objetos (funções e procedimentos) vc pode estabelecer bloqueios e transações também.

Em mi caso especificamente é outro pais, mas os boletos ou documentos fiscais devem ser consecutivos e sem valores nulos intermédios, ademais as datas devem ser consecutivas e progresivas. Imagina que a API devolve erro, como localizar o seguinte número disponível, antes ou depois do atual. A força bruta???