sqlite3 データベースの操作方法をカプセル化する場合、テストコードは次のようになります:
$path = 'test.db';
$conn = new sqlite3($path) ;
$sql = 'tb_test に挿入...';
for($i=0;$i<10000,$i ){
$conn- > query($sql);
}
トランザクション制御を追加したいのですが、sqlite3 に追加する方法が見つかりませんでした。トランザクションの場合は、新しい pdo() を使用してください。私は以前 Java を書いたことがありますが、PHP にはまだ慣れていません。すべてのプログラマーが回答できることを願っています。ありがとうございます。
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 である)、マスター制御プログラムのグローバル変数が変更される可能性があることを今日発見しました。 。
詳細についてはさらなる調査が必要です。