質問 > その他 > 処理中に逐一DBに保存したい |
その他
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
hmorita_j |
投稿日時: 2017/5/19 19:18
対応状況: −−−
|
長老 登録日: 2017/3/3 居住地: 沈黙の巨大都市松戸 投稿: 222 |
処理中に逐一DBに保存したい お世話になっております。
3.0.11以降、「アプリケーションの開始/終了のタイミングでトランザクションのコントロールを行う」となりました。 この場合、処理の中で逐一DBに保存したい場合はどのようにしたら良いのでしょうか? |
nyorai |
投稿日時: 2017/5/22 12:45
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 処理中に逐一DBに保存したい 処理中の間、setAutoCommit(true)に設定しておけばいけそうです。
一応検証コードを作成してみて、想定どおり登録できているのを確認しました。
SQLiteで試したので、他のDBだと挙動が異なるかもしれません。 |
hmorita_j |
投稿日時: 2017/5/23 12:34
対応状況: −−−
|
長老 登録日: 2017/3/3 居住地: 沈黙の巨大都市松戸 投稿: 222 |
Re: 処理中に逐一DBに保存したい ありがとうございます!
MySQLで同じ挙動となりました。 これはトランザクションを一旦終わらせる、ということですよね? もしプラグインでこのようなことをする場合、本体のトランザクション制御はそのままで、新たにコネクションを取得したほうが良いのかな?とか思ったのですがどうなんでしょう? 新たにコネクションを取得する方法もご存知でしたらご教示いただきたいです。 |
nyorai |
投稿日時: 2017/5/23 13:37
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 処理中に逐一DBに保存したい > これはトランザクションを一旦終わらせる、ということですよね?
そうですね。本体のトランザクションいったんコミットして、再度beginTransactionするような挙動になります。 ※index_dev.phpでSQLログをみれば、どんなトランザクションになるかはわかると思います。 先程の検証コードは、正しくは以下になります。 プラグインでやると、先発・後続のプラグインのSQLにまで影響がでてしまうので、少しまずいかもしれませんね。
> 新たにコネクションを取得する方法もご存知でしたらご教示いただきたいです。 こんな感じのコードになります。 ※Doctrineのドキュメントにありました。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html
|
hmorita_j |
投稿日時: 2017/5/23 14:02
対応状況: −−−
|
長老 登録日: 2017/3/3 居住地: 沈黙の巨大都市松戸 投稿: 222 |
Re: 処理中に逐一DBに保存したい ありがとうございます!!
公式ドキュメントをちゃんと読まないとダメですね・・・ 助かりました! |
nyorai |
投稿日時: 2017/5/24 13:09
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 処理中に逐一DBに保存したい 少しだけ注意が必要なのですが、本体のエンティティマネージャには、SoftDeleteFilter(検索時にdel_flg=0を自動でつける)や、SaveEventSubscriber(登録・更新時に自動でcreate_date, update_dateを設定する)が設定されています。
ここで生成したエンティティマネージャはまっさらな状態なので、そういった機構が効きません。 例えば、
のようなとき、本体のエンティティマネージャで処理していれば、create_date/update_dateは自動で設定されますが、新たに生成したエンティティマネージャだと、そういうことはやってくれません。
みたいに明示的にセットしておく必要があります。 検索するときも、単純にfindAll()とかすると、削除済みのレコードも取得できてしまうので、findBy(array('del_flg' => 0))のようにしておいてください。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |