Quiero agregar algo a la solución del problema: tener en cuenta el entorno en el que se produce la venta. Como lo dice Nikolas.
Si la venta en en línea y se entrega la mercadería a domicilio, algo como sucede con las ventas de Amazon, etc. es una cosa, pero, si la venta sucede en una caja registradora, no hay motivos para hacerse problemas con el stock, ya que es un valor tácito. Es imposible que teniendo la mercadería en el "check-out" no haya.
En otras palabras, en la venta con cajas registradoras, el stock debe ser descontado al terminar la transacción y no importará en otra venta de caja este stock resultante.
Yo, lo que hago es más o menos como los pasos que describe Agustín, exactamente, como dice Él, no hay otra con la generación (Post-> generar el ID de venta) de la cabecera y que todo esté dentro de una misma transacción. En cuanto al stock, lo divido en dos tiempos, vendido y entregado, el stock se descuenta al ser vendido, pero no se marca como entregado hasta que se genere el remito correspondiente, claro que esto funciona para ferreterías, mueblerías y mayoristas, mas no tanto en mini o supermercados con cajas registradoras (pues no hay remito).
En definitiva el momento para descontar el stock, es precisamente cuando se contrae la responsabilidad de entregar el producto al comprador. Es decir, la venta.
Existen sitios de venota en línea por internet que muestran con una barra de color cuando escacea el stock, normalmente va de rojo a verde (menos a más).
El asunto del stock no es sencillo y es un estudio aparte en toda la política de la empresa, ya que existe lo que se llama quiebre de stock, costo de mantener stock, entre otras cosas. Por eso es conveniente tener un seguimiento de las rotaciones de cada producto.
Me parece una buena solución la que describe Agustín, marcar la cantidad de artículos que pueden salir al ser vendidos eventualmente, pero cuya transacción aun no se ha concretado.
Saludos.