J'ai une transaction financière qui ressemble à quelque chose comme ça (pseudo):
begin
select record for update
update record(same record as selected)
insert another record into another table
commit
Si j'appelle SELECT ... FOR UPDATE
Dans la transaction, le verrouillage sera-t-il libéré pour les lignes spécifiques que lorsque la transaction est commise?
Selon la page 418 Paragraphe 3 de Guide d'étude de certification MySQL 5.
les commandes suivantes peuvent casser une transaction
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
LOCK TABLES
UNLOCK TABLES
SET AUTOCOMMIT = 1
START TRANSACTION
Tant que vous n'êtes pas de ces commandes dans la transaction, la transaction doit être stable. En fait, Select for Update est si fort que les verrouillages de la ligne envahissent les index ainsi que les données. Il pourrait même mettre en place des impacts d'innodb éventuels. J'ai écrit une fois à ce sujet à ce poste: Sélectionner pour la mise à jour donne une erreur sur la colonne indexée
Tant que vous gardez des transactions courtes et douces, SELECT FOR UPDATE
ne devrait pas être un problème. Si vous souhaitez protéger votre transaction des blocages intermittents ou inattendus, MySQL 5.6 présente maintenant ce qui suit:
START TRANSACTION READ WRITE;
START TRANSACTION READ ONLY;
Vous devriez commencer la transaction avec des options telles que celles-ci. Pourquoi ?
Selon cette documentation MySQL :
Les modificateurs d'écriture de lecture et de lecture de lecture définissent le mode d'accès à la transaction. Ils permettent ou interdisent les modifications apportées aux tables utilisées dans la transaction. La restriction en lecture seule empêche la transaction de modifier ou de verrouiller des tables transactionnelles et non entraînantes visibles à d'autres transactions; La transaction peut toujours modifier ou verrouiller des tables temporaires. Ces modificateurs sont disponibles à partir de MySQL 5.6.5.
Votre dernier commentaire était
alors puis-je verrouiller des lignes dans une transaction d'une autre manière à la mise à jour
Vous pouvez également exécuter Sélectionnez ... verrouillage en mode de partage . La documentation dit
Bien que possible, gardez les transactions courtes. Sinon, vous pouvez augmenter la probabilité d'impasse.
Pour effacer toutes les idées fausses, Veuillez noter ceci à partir de la documentation MySQL :
Tous les verrous définis par verrouillage en mode d'actions et pour la mise à jour Les requêtes sont libérées lorsque la transaction est commise ou roulée.
Par conséquent, si vous exécutez Sélectionnez ... Verrouiller en mode de partage Dans une transaction, les rangées restent verrouillées jusqu'à ce que la transaction s'engage ou roule.
Boucle également si le gestionnaire d'exception est hors de boucle et que la portée de la transaction est en boucle, même la transaction de MySQL enfreint la transaction à une exception, mieux déclarer le gestionnaire d'exceptions, le cas échéant, la transaction de la même portée a été déclarée.