En principio, habría que analizar el INSERT que ejecutas para el detalle. Si ese INSERT usa la tabla PRODUCTOS en alguna forma, entonces no puedes utilizarla en este trigger. En caso de no ser eso, hay que revisar todos los SP y triggers que puedan estar involucrados en la operación, ya que puede haber un bloqueo en alguna etapa no visible.
Este tipo de entrecruzamientos de triggers no es tan raro como parece. Si abusas innecesariamente de los TRIGGERs es fácil que aparezcan interbloqueos de difícil diagnóstico. Tienes que tener muy en cuenta que un SELECT en una subconsulta que alimenta un INSERT/UPDATE, o bien un TRIGGER que ejecute una lectura de una tabla cualquiera, genera un bloqueo de escritura en esa tabla.
Por otro lado, hay un error de lógica: Los productos a entregar en una venta se deben
reservar al momento de insertarse en la factura, pero sólo deben restarse al emitir el comprobante de venta/cobro.
Si la factura es el comprobante de venta, se hace entonces con el alta del pago en la caja.
La idea es que:
1) Sólo al emitir el pago el cliente el cliente se hace dieño del bien adquirido.
2) El bien en stock debe ser reservado para evitar que una venta en curso iniciada después de esta, lo elimine del stock antes de completar la venta.
Eso es a nivel sistema.
Por lo demás, esta línea es innecesaria:
Puedes escribirlo asi: