El LOCK lo usa el motor para impedir que dos usuarios efectúen una modificación en el mismo dato en el mismo momento; pero no tiene relación con obtener un dato, incrementarlo, y adicionar. Si dos usuarios usan un select max(id) from tabla, obtendrán el mismo valor. Si le adicionan uno y van a insertar, uno lo alcanzará a hacer, el otro error de duplicidad de llave.
Yo para estas cosas corté por lo sano: número autogenerado en campo ID, y si tengo que borrar me da lo mismo que no sean secuenciales, ya que solo se usan para indicar unívocamente un registro, pero más utilidad no debería tener. Es más ahora no les encuentro tanto sentido, para eso mejor modelar las PK y FK en el diseño lógico, y controlar con datos reales esto.
En el caso de los procesos de BI, acá utilizaron un secuenciador de PowerCenter para aumentar el número y es una paja, porque frecuentemente se pillan procesos y quedan sin insertar el dato. Adicional, que está mal implementado.