Devi mettere entrambe le connessioni in un livello di isolamento della transazione serializzabile per evitare lo scenario che stai descrivendo, sia impostando il tx_isolation
su ogni connessione con:
SET @@tx_isolation = SERIALIZABLE;
o
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
oppure impostando il livello di isolamento globale con:
SET @@global.tx_isolation = SERIALIZABLE;
o
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
che viene ereditato da qualsiasi connessione aperta successivamente. A quel livello, le transazioni si bloccheranno su qualsiasi query se è già in corso un'altra transazione, ad es. una transazione ha già emesso una query (lettura o scrittura) sulle stesse tabelle.
Vedi la documentazione di mysql per ulteriori dettagli.