Eu bloquearia apenas o registro do produto (com selecionar para atualização - note, selecione o bloqueio no modo de compartilhamento não bloqueará outro usuário para comprar o mesmo produto) e, em seguida, execute o restante da operação. Dessa forma, não bloquearei a compra de outros produtos (enquanto o bloqueio da tabela bloqueará todas as operações de gravação, independentemente de haver para o produto 1 ou produto 2) E por que você está mantendo a propriedade max_product_can_sell em vez de (ou não junto com) available_quantity propriedade?
Depende do nível de isolamento. Em serializável - sim, em níveis mais baixos, tenho quase certeza, não.