Você está perdendo algumas coisas no lado do servidor para fazer isso funcionar.
Primeiro, como @RiggsFilly apontou, você precisa usar uma cláusula WHERE na instrução. A condição deve ser procurar transações mais recentes que o último enviado.
Para isso, você precisa acompanhar o timestamp da última mensagem enviada.
O servidor só deve enviar uma mensagem se a consulta, agora com a condição, retornar um resultado.
Por fim, toda a rotina para verificar novas transações e enviar uma mensagem caso seja encontrada deve ser mantida em loop.
<?php
include 'conn.php'; // database connection
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
$query = "SELECT TimeStamp, CardNo FROM transactions WHERE TimeStamp > ?";
$stmt = $conn->prepare($query);
$ts = time();
while(true)
{
if ($result = $stmt->execute([$ts])) {
$row = $result->fetch_assoc();
echo "data: " . $row['CardNo'] . "\n\n";
$ts = $row['TimeStamp'];
flush();
}
sleep(2);
}