diff --git a/src/seq/seq_ca.c b/src/seq/seq_ca.c
index 1ffccc84fd4a062202ab146e209cc96dd4750a65..29b1c696ce16479386d67cf9b862185b9eccc3db 100644
--- a/src/seq/seq_ca.c
+++ b/src/seq/seq_ca.c
@@ -305,21 +305,23 @@ static void proc_db_events(
 			   Set the dirty flag only if this was a monitor event. */
 			ss_write_buffer(ch, val, &meta, evtype == pvEventMonitor);
 		}
+	}
+
+	epicsMutexMustLock(sp->programLock);
 
-		/* Signal completion */
-		if (ss)
+	/* Signal completion */
+	if (ss)
+	{
+		switch (evtype)
 		{
-			switch (evtype)
-			{
-			case pvEventGet:
-				epicsEventSignal(ss->getSemId[chNum(ch)]);
-				break;
-			case pvEventPut:
-				epicsEventSignal(ss->putSemId[chNum(ch)]);
-				break;
-			default:
-				break;
-			}
+		case pvEventGet:
+			epicsEventSignal(ss->getSemId[chNum(ch)]);
+			break;
+		case pvEventPut:
+			epicsEventSignal(ss->putSemId[chNum(ch)]);
+			break;
+		default:
+			break;
 		}
 	}
 
@@ -329,6 +331,8 @@ static void proc_db_events(
 
 	/* Wake up each state set that uses this channel in an event */
 	ss_wakeup(sp, ch->eventNum);
+
+	epicsMutexUnlock(sp->programLock);
 }
 
 /* Disconnect all database channels */