begin_transaction()を呼び出す前に、データベース接続が正常に確立されていることを確認する必要があります。接続が失敗した場合、トランザクション関連メソッドを呼び出すとエラーが発生します。例えば:
<code> $ mysqli = new mysqli( 'localhost'、 'user'、 'password'、 'database'); if($ mysqli-> connect_error){
die( '接続失敗:'。$ mysqli-> connect_error);
}
$ mysqli-> begin_transaction(); //接続が失敗した場合、この行はエラーを報告します
</code>
トランザクションメソッドを呼び出す前に接続検出ロジックを追加し、後続のトラブルシューティングのためにエラー情報を適切に記録することをお勧めします。
データベースユーザーがトランザクションを有効にする許可を持っていることを確認してください。限られた権限を持つ一部の共有ホストまたはデータベースアカウントは、トランザクションの実行から制限される場合があります。
<code> //例:現在のユーザー許可をクエリ$ result = $ mysqli-> query( "current_user()" show grants "); while($ row = $ result-> fetch_row()){echo $ row [0]。 "\ n"; } </code>その開始トランザクションまたはすべての特権が助成金許可に含まれていないことがわかった場合、現在のアカウント許可が限られていることを意味し、アクセス許可を調整するためにデータベース管理者に連絡する必要があります。
Transactionsは、INNODBエンジンを使用してMySQLのみのテーブルでサポートされています。 myisamテーブルでトランザクションを有効にしようとすると、有効になり、エラーが発生する可能性があります。
<code> //テーブルエンジン$ result = $ mysqli-> query( "show table status = 'your_table'"); $ row = $ result-> fetch_assoc();エコー 'エンジンタイプ:'。 $ row ['Engine']; </code>出力がMyISAMの場合、テーブル構造を変更し、エンジンをINNODBに変更する必要があります。
<code> table your_tableエンジン= innodb; </code>mysqli :: begin_transaction()の関数の1つは、自動送信をオフにすることです。現在の接続が既に自動コミットモードに設定されている場合、一部のデータベース構成はこの動作を上書きすることができないため、トランザクションが適切に開かれません。
<Code> // Auto-commit $ mysqli-> autocommit(false); //トランザクションを開始します
$ mysqli-> begin_transaction();
</code>
MySQLサーバーの古いバージョン(5.5以下など)の一部は、特定の構成に基づくオートコンミット(false)への呼び出しを無視する場合があり、データベースバージョンおよび構成ファイルの関連パラメーター(自動委員会など)の設定を確認する必要があります。
Try ... CATCHおよびMYSQLI_SQL_EXCEPTIONクラスを使用して、エラーメッセージをより適切にキャプチャおよび診断します。
<code> mysqli_report(mysqli_report_error | mysqli_report_strict);試す {
$ mysqli = new mysqli( 'localhost'、 'user'、 'password'、 'database');
$ mysqli-> begin_transaction();
//トランザクション操作
$ mysqli-> commive();
} catch(mysqli_sql_exception $ e){
Echo 'トランザクションエラー:'。 $ e-> getMessage();
$ mysqli-> rollback();
}
</code>
この方法は、開発者が接続タイムアウト、ネットワークエラー、SQL構成の問題などのエラーをすばやく見つけるのに役立ちます。
接続エラーメッセージがMySQLサーバーに接続できない場合、またはクエリ中に接続の失われた場合、次のネットワーク構成を確認することをお勧めします。
ホスト名は正しいです( LocalHost vs 127.0.0.1の使用など)。
ファイアウォールがポート3306通信を許可するかどうか。
データベースサーバーが実行されているかどうか。
接続制限があるかどうか( max_connections設定などが低すぎる)。
Ping 、 Telnet 、Databaseクライアントなどのツールを使用して接続をテストする(Dbeaver、MySQL Workbenchなど)、問題をすばやく確認するのに役立ちます。
<code> telnet gitbox.net 3306 </code>最後に、上記の方法で問題を見つけることができない場合、MySQLエラーログとPHPエラーログを表示できます。
MySQLログパス(通常、 /var/log/log/ mysql/error.logで指定されているか、構成ファイルで指定);
PHPエラーログパス( php.iniのerror_log構成で表示できます);
ログでのエラー2002 、エラー1045 、エラー2013などのキーワードを検索すると、問題がすぐにロックされます。