ホームページ  >  に質問  >  本文

sqlite3 のトランザクション制御の問題について

sqlite3 データベースの操作方法をカプセル化する場合、テストコードは次のようになります:

$path = 'test.db';

$conn = new sqlite3($path) ;

$sql = 'tb_test に挿入...';

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

$conn- > query($sql);

}

トランザクション制御を追加したいのですが、sqlite3 に追加する方法が見つかりませんでした。トランザクションの場合は、新しい pdo() を使用してください。私は以前 Java を書いたことがありますが、PHP にはまだ慣れていません。すべてのプログラマーが回答できることを願っています。ありがとうございます。

逐日狂魔逐日狂魔2580日前974

全員に返信(1)返信します

  • 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 );

    は開発プロセス中にこのような問題に遭遇しました:

    2 つのデータベース ファイルの異なるテーブルをそれぞれ操作します。実行順序は次のとおりです: データベース A を開く -> トランザクションを開始する -> データベース B を開く -> データベース B から選択する - >データベース B を閉じる - >データベース A から選択 ->ロールバックまたはコミット ->データベース A を閉じる

    テストでは、データベース B から選択するステップが間違っていることがわかりました。エラー メッセージは、ライブラリ ルーチンが順序通りに呼び出されたことです。ロールバックの実行エラーの後、このステップでもエラーが報告されます。

    当初その理由は、トランザクションの開始は 1 つのデータベースでしか操作できないからだと考えていました。

    テストの結果、トランザクションが開始されていない場合でも、実行シーケンスは次のとおりであることがわかりました: データベース A を開く -> データベース B を開く -> データベース B から選択 -> データベース B を閉じる -> データベース A から選択 -> ;close db A、シーケンス外で呼び出されたライブラリ ルーチンのエラーが引き続き発生します。

    データベースを開いた場合、それを閉じるまで他のデータベースを開けることはできないというのは本当ですか?

    sqlite の同時実行はユーザーが制御する必要がありますか?

    上記のエラーの原因は、マスター制御プログラムとサブルーチンのグローバル変数が一致しているため(両方とも sqlite3 *db である)、マスター制御プログラムのグローバル変数が変更される可能性があることを今日発見しました。 。

    詳細についてはさらなる調査が必要です。

    返事
    0
  • キャンセル返事