recherche

Maison  >  Questions et réponses  >  le corps du texte

À propos des problèmes de contrôle des transactions dans sqlite3

Lors de l'encapsulation de la méthode d'exploitation de la base de données sqlite3, le code de test est le suivant :

$path = 'test.db';

$conn = new sqlite3($path); .. .';

for($i=0;$i<10000,$i++){

  $conn->query($sql);


}

Parce que je souhaite ajouter un contrôle des transactions, mais je l'ai compris, je n'ai trouvé aucune méthode sur sqlite3. Comment ajouter des transactions utilise new pdo(). J'ai déjà écrit Java et je ne suis pas encore familier avec PHP. J'espère que tous les codeurs pourront y répondre, merci.

逐日狂魔逐日狂魔2581 Il y a quelques jours979

répondre à tous(1)je répondrai

  • ringa_lee

    ringa_lee2017-10-21 09:51:38

    //sqlite3 事务的操作没有特别的接口函数,就是一个普通的 sql 语句而已,分别如下:
    int ret ; 
    ret = sqlite3_exec ( db , "begin transaction" , 0 , 0 , & zErrorMsg ); // 开始一个事务 
    ret = sqlite3_exec ( db , "commit transaction" , 0 , 0 , & zErrorMsg ); // 提交事务 
    ret = sqlite3_exec ( db , "rollback transaction" , 0 , 0 , & zErrorMsg );     
    
    //如果要进行大量的操作前使用如下语句 
    ret = sqlite3_exec ( db , "begin transaction" , 0 , 0 ,& zErrorMsg ); 
    for (...) {   
    //insert into operate     
    // 如果操作错误  
    ret = sqlite3_exec ( db , "rollback transaction" , 0 , 0 , & zErrorMsg )
     } 
     ret = sqlite3_exec ( db , "commit transaction" , 0 , 0 , & zErrorMsg );

    a rencontré un tel problème pendant le processus de développement :

    opérer sur différentes tables de deux fichiers de base de données respectivement. La séquence d'exécution est la suivante : ouvrir la base de données A-> commencer la transaction-> ouvrir la base de données B-> sélectionner dans la base de données B-. >close db B->select from db A->rollbak ou commit->close db A

    Le test a révélé que l'étape de sélection dans la base de données B générerait une erreur. Le message d'erreur est une routine de bibliothèque appelée hors de. Après l'erreur Exécuter la restauration, cette étape signalera également une erreur.

    Au départ, je pensais que la raison était la suivante : le démarrage d'une transaction ne peut fonctionner que sur une seule base de données.

    Le test a révélé que même si la transaction n'est pas démarrée, la séquence d'exécution est la suivante : ouvrir la base de données A-> ouvrir la base de données B-> sélectionner dans la base de données B-> fermer la base de données B-> sélectionner dans la base de données A-> ;close db A, L'erreur de la routine de bibliothèque appelée hors séquence se produit toujours.

    Est-il vrai que si vous ouvrez une base de données, vous ne pouvez pas ouvrir d'autres bases de données avant de la fermer ?

    L'exécution simultanée de sqlite doit-elle être contrôlée par l'utilisateur ?

    J'ai découvert aujourd'hui que la cause de l'erreur ci-dessus peut être que les variables globales du programme de contrôle principal et le sous-programme sont cohérents (les deux sont sqlite3 *db), ​​​​ce qui entraîne la modification des variables globales du programme de contrôle principal. .

    Les détails nécessitent des recherches plus approfondies.

    répondre
    0
  • Annulerrépondre