A framework for parallelizing both matching and execution phases of a production system is presented. It is shown how concurrency causes new problems, which, if not handled carefully, can lead to inconsistent semantics. A new kind of data conflict is identified as the root cause of this problem. A framework for ensuring correct parallel executions is developed. The performance of the system critically depends on the scheduling of productions, which should aim at maximizing the utilization of parallelism. The design of a pessimistic (careful) scheduler and an optimistic scheduler is discussed, and their proofs of correctness are provided.