2017-04-06 2 views
0

Désolé si c'est une question stupide. J'ai l'application MySQL InnoDB avec plus de 70 tables et en utilisant des transactions. Tout fonctionne bien, sauf une chose (tableau):InnoDB principe de transaction

CREATE TABLE IF NOT EXISTS `mag_pj_art_sums` (
`id` int(11) NOT NULL, (primary key) 
`id_pj` int(11) NOT NULL, (index) 
`id_artikal` int(11) NOT NULL, (index) 
`kol_stanje_knjig` decimal(18,2) DEFAULT NULL) 

J'utilise même principe pour toutes les requêtes:

Dans tous les tableaux de clé primaire
START TRANSACTION (query('set autocommit=0;'); query('START TRANSACTION;');) 
SELECT … FROM table WHERE … 
UPDATE TABLE SET …. WHERE …. 
COMIT 

est utilisé pour SELECT et UPDATE (en-dessous schéma de requête).

Sauf mag_pj_art_sums où j'utilise:

SELECT … FROM mag_pj_art_sums WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj') 

et

UPDATE mag_pj_art_sums SET … WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj') 

Est-il possible que ces lignes ne sont pas enfermés dans ce scénario? Parce que, seulement dans cette table j'ai des valeurs incohérentes quand il y a une requête SELECT - UPDATE concurrente. La requête est exécutée sans erreur, mais les valeurs ne sont PAS mises à jour comme elles le devraient.

Répondre

2

Non, ils ne sont pas verrouillés. Lorsque vous n'avez pas modifié le niveau d'isolation de la transaction, la valeur par défaut est REPEATABLE-READ. Cela signifie que les lectures fantômes sont possibles. J'ai écrit une courte explication à ce sujet dans this answer.

Ce que vous devez faire est

START TRANSACTION; 
SELECT … FROM table WHERE … FOR UPDATE; 
UPDATE TABLE SET …. WHERE …; 
COMMIT; 

En savoir plus sur SELECT ... FOR UPDATEhere.

+0

Mes doutes confirmés. Merci – MiTja

1

INDEX(id_artikal), INDEX(id_pj) est et non le même que INDEX(id_artikal, id_pj). Ajouter le dernier Les deux requêtes seront beaucoup plus rapides.

Oui, le FOR UPDATE est requis. Ce doit être ajouté pour tous cas de START; SELECT...; UPDATE (same row)...; COMMIT. Vous avez peut-être des erreurs que vous n'avez pas remarquées! Je ne m'inquiéterais pas de tx_isolation.

+0

Et ce nouveau niveau ouvert dans ma vie mysql :-) Il suffit de lire votre texte fantastique à http://mysql.rjweb.org/doc.php/index_cookbook_mysql Merci – MiTja

+0

Vous êtes les bienvenus, et merci pour les mots gentils. Vous n'êtes pas seul à trouver des informations utiles là-bas. Plus il y aura de personnes qui liront ce blog, moins il y aura de réponses aux questions «simples» sur ce forum. –