【PhpStorm】DBツールでテーブル参照時、新しく挿入されたレコードを取得できなくなったときに確認する設定
痩せた状態をキープしようとずっと頑張っていたのですが、太りやすい体質も才能のうちなんじゃないかと思い始め、太る方向にシフトし始めているfukasawaです。こんにちは。目的もなく太り続けているので、太るのに飽きたらまた萎みます。
今回はPhpStormの小ネタです。PhpStormのDBツールを使用してデータベースに接続しテーブルを参照した際、リロードボタンを押しても、再度SELECTを発行しても、新規追加されたレコードを取得できないということがありました。一度接続を切って再度接続すればちゃんと取得できる……、となったときに確認する設定についてです。
- PhpStorm 2017.2.4
確認する設定
Data Source Properties、もしくはコンソールの「Tx」という設定が「Auto」になっていることを確認します。「Manual」が選択されている場合に今回のような現象が発生する可能性があります。
ここはトランザクションに関する設定で、「Auto」を選択すると自動コミットでコミットボタンを押さなくても変更がすぐに反映されるようになり、「Manual」を選択した場合、コミットボタンを押さないと変更が反映されないという状態になります。
「Manual」になっていると今回のような状態になる可能性があるのですが、 「Manual」になっていれば必ず発生するわけではなく、発生するかどうかはその下の「Isolation Level」によります。
「Isolation Level」つまりトランザクション分離レベルです。タイミングよくsagara くん が最近トランザクション分離レベルに関する記事をアップしてたので、細かい説明はそちらを参照してください。
「Manual」選択時にPhpStormのコンソールでSELECTを発行した際、コミットボタンかロールバックボタンを押すまでは1トランザクション内の処理として扱われるようです。 つまり、ファントムリード(別のトランザクションで挿入されたデータを参照できてしまう問題)を回避する分離レベルが選択されていた場合に発生する現象で、 例えばMySQLの場合は「REPEATABLE READ」「SERIALIZABLE」が選択されていると、コミットorロールバックを押すまでは新しく挿入された行を取得しない状態になるようです。 (MySQLはデフォルトが「REPEATABLE READ」になっているので「Database Default」を選択している場合も同様です。)
SELECTでDBの中身を見るだけならトランザクションとか関係ないような気になっていましたが、このあたりの設定によって他のトランザクションで更新されたレコードの内容を参照できなかったりするみたいなので、少し注意する必要がありそうです。