sqlite3 のトランザクション制御の問題について
逐日狂魔
逐日狂魔 2017-10-20 16:25:54
0
1
971

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

$path = 'test.db';

$conn = new sqlite3($path) ;

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

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

$conn- > query($sql);

}

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

逐日狂魔
逐日狂魔

全員に返信(1)
ringa_lee
//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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!