Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment copier des données d'une autre table sans verrouiller la table dans MYSQL 6.2 ?

Étant donné que les tables ont exactement les mêmes colonnes, vous pouvez faire quelque chose comme ceci :

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
INSERT INTO NEW_TABLE (SELECT * FROM OLD_TABLE);
COMMIT ;

J'ai inclus quelques explications supplémentaires basées sur Wistar commentaire. Les niveaux de lecture utilisables ici sont :

  • LIRE COMMITTED  :un niveau d'isolation un peu semblable à Oracle en ce qui concerne les lectures cohérentes (sans verrouillage) :chaque lecture cohérente, même au sein de la même transaction, définit et lit son propre instantané
  • LIRE SANS ENGAGEMENT :Les instructions SELECT sont exécutées de manière non bloquante, mais une éventuelle version antérieure d'une ligne peut être utilisée. Ainsi, en utilisant ce niveau d'isolement, ces lectures ne sont pas cohérentes. C'est ce qu'on appelle aussi une lecture sale. Sinon, ce niveau d'isolement fonctionne comme READ COMMITTED.
  • LECTURE RÉPÉTABLE :Il s'agit du niveau d'isolement par défaut pour InnoDB. Pour les lectures cohérentes, il existe une différence importante par rapport au niveau d'isolement READ COMMITTED :toutes les lectures cohérentes au sein d'une même transaction lisent l'instantané établi par la première lecture. Cette convention signifie que si vous émettez plusieurs instructions SELECT simples (non verrouillables) dans la même transaction, ces instructions SELECT sont également cohérentes les unes par rapport aux autres.
  • SÉRIALISABLE :Ce niveau est comme REPEATABLE READ, mais InnoDB convertit implicitement toutes les instructions SELECT simples en SELECT ... LOCK IN SHARE MODE si la validation automatique est désactivée. Si la validation automatique est activée, le SELECT est sa propre transaction. Il est donc connu pour être en lecture seule et peut être sérialisé s'il est effectué comme une lecture cohérente (non bloquante) et n'a pas besoin d'être bloqué pour d'autres transactions. (Pour forcer un simple SELECT à bloquer si d'autres transactions ont modifié les lignes sélectionnées, désactivez la validation automatique.)

J'espère que cela vous aidera.