Verrouillage des tables empêche les autres DB utilisateurs d'affecter les lignes/tables que vous avez verrouillé. Mais les verrous, en eux-mêmes, ne permettra PAS d'assurer que votre logique est livré dans un état cohérent.
Pensez à un système bancaire. Lorsque vous payez une facture en ligne, il y a au moins deux comptes touchés par l'opération: Votre compte, à partir de laquelle l'argent est prélevé. Et le compte du bénéficiaire, dans lequel l'argent est transféré. Et le compte de la banque, dans lequel ils seront ravis de dépôt de tous les frais de service facturés sur la transaction. Étant donné (que tout le monde connaît ces jours-ci) que les banques sont extraordinairement stupide, disons que leur système fonctionne comme ceci:
$balance = "GET BALANCE FROM your ACCOUNT";
if ($balance < $amount_being_paid) {
charge_huge_overdraft_fees();
}
$balance = $balance - $amount_being paid;
UPDATE your ACCOUNT SET BALANCE = $balance;
$balance = "GET BALANCE FROM receiver ACCOUNT"
charge_insane_transaction_fee();
$balance = $balance + $amount_being_paid
UPDATE receiver ACCOUNT SET BALANCE = $balance
Maintenant, avec pas de serrures et pas de transactions, ce système est vulnérable à diverses conditions de course, le plus important est de multiples paiements effectués sur votre compte ou sur le compte séquestre en parallèle. Alors que votre code a votre équilibre récupéré et est en train de faire la huge_overdraft_fees() et autres joyeusetés, il est tout à fait possible que certains autres de paiement sera exécuté le même type de code en parallèle. Ils vont récupérer votre solde ($100), faire leurs transactions (sortir le 20 $que vous payez, et de 30 $pour les elles sont de vissage plus avec vous), et maintenant les deux chemins de code ont deux différents soldes: $80 $à 70$. Selon celles qui termine dernière, vous vous retrouverez avec l'une de ces deux soldes dans votre compte, au lieu de 50$, vous devriez en avoir fini avec ($100 - $20 - $30). Dans ce cas, "erreur de la banque en votre faveur".
Maintenant, disons que vous utiliser des verrous. Votre paiement de facture ($20) frappe le tuyau d'abord, donc, il gagne et verrouille le dossier de votre compte. Maintenant vous avez l'usage exclusif, et peut déduire le montant de 20 $de l'équilibre, et d'écrire le nouvel équilibre de retour à la paix... et votre compte se retrouve avec $80 comme c'est prévu. Mais... uhoh... Vous essayez de mettre à jour le compte du bénéficiaire, et c'est fermé et verrouillé plus long que le code permet, le calendrier de votre transaction... Nous avons affaire à des stupides les banques, de sorte qu'au lieu d'avoir une bonne gestion d'erreur, le code tire juste un exit()
, et de vos 20 $disparaît dans un nuage d'électrons. Maintenant que vous êtes hors de 20$, et il vous reste à payer 20 $pour le récepteur, et votre téléphone reçoit repris.
Alors... à saisir les transactions. Vous démarrer une transaction, vous débiter votre compte de 20$, vous essayez de crédit le récepteur avec 20 $... et quelque chose de nouveau coups. Mais cette fois, au lieu de exit()
, le code peut juste faire rollback
, et hop, votre 20$, c'est comme par magie ajouté à votre compte.
En fin de compte, il se résume à ceci:
Serrures empêcher quiconque d'interférer avec les enregistrements de base de données que vous avez affaire. Transactions gardez tout "plus tard" erreurs d'interférer avec le "plus haut" les choses que vous avez fait. Ni elle seule peut garantir que les choses fonctionnent ok à la fin. Mais ensemble, ils le font.
demain dans la leçon: La Joie de Blocages.