2011-08-22 8 views
5

Stiamo creando un sistema altamente transazionale con MySQL come DB (motore innodb). Abbiamo un trigger di inserimento e aggiornamento sulla tabella t1 che sta aggiornando la tabella t2 e t3. Abbiamo osservato che ogni volta che il volume di utenti simultanei è elevato, stiamo diventando dead-lock sulla tabella t1. Supponiamo che il trigger stia emettendo un lock da tavolo fino a quando non sta completando la sua esecuzione. Abbiamo abbassato il grilletto su t1 e sorprendentemente non esiste più un deadlock.Trigger in un sistema altamente transazionale

La mia domanda:

  1. Non è forse consigliabile avere scatto in un sistema altamente transazionale
  2. Se non attivano quali sono le nostre altre opzioni per attuare la stessa logica.

La tabella t1 ha circa 70.000 file e aumenta su base giornaliera.

Apprezzare qualsiasi input.

Grazie in anticipo.

+4

Non hai fornito abbastanza informazioni. L'emissione di 'SHOW ENGINE INNODB STATUS' ti mostrerà la causa del deadlock. La riga 70k non è proprio nulla, quello che dovresti fare (se vuoi aiuto) è pubblicare la query in questione, la struttura della tabella e il trigger. È possibile sostituire i nomi dei campi effettivi con lettere in modo che la logica aziendale non venga rivelata. –

risposta

0

È possibile utilizzare le transazioni e fare tutto il lato client di elaborazione.

START TRANSACTION; 

insert into t1; 
update t2; 
update t3; 

COMMIT; 

Prova e non usare 'aggiornamento selezionare' e 'inserire selezionare' costruisce se si riesce a cavarsela con l'utilizzo di dati dei clienti forniti. Anche InnoDB utilizza il blocco delle righe, che è migliore del blocco della tabella utilizzato da MyISAM.

Problemi correlati