バージョン選択

フォーラム

メニュー

オンライン状況

53 人のユーザが現在オンラインです。 (42 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 52
Ghercel もっと...

サイト内検索

質問 > その他 > 処理中に逐一DBに保存したい

その他

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
nyorai
投稿日時: 2017/5/23 13:37
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 処理中に逐一DBに保存したい
> これはトランザクションを一旦終わらせる、ということですよね?

そうですね。本体のトランザクションいったんコミットして、再度beginTransactionするような挙動になります。
※index_dev.phpでSQLログをみれば、どんなトランザクションになるかはわかると思います。

先程の検証コードは、正しくは以下になります。
プラグインでやると、先発・後続のプラグインのSQLにまで影響がでてしまうので、少しまずいかもしれませんね。


    public function index(Application $app)
    {
        // TransactionListener::onKernelRequestで開始されたトランザクションを一旦commit
        $app['orm.em']->getConnection()->commit();
        // auto commitを有効にして、flushごとにcommitされるようにする
        $app['orm.em']->getConnection()->setAutoCommit(true);

        $i = 30;
        $max = $i+10;
        for (; $i < $max; $i++) {
            $job = new Job();
            $job->setId($i);
            $job->setName($i);
            $job->setRank($i);

            $app['orm.em']->persist($job);
            $app['orm.em']->flush($job);

            if ($i == 35) {
                // 処理中にエラーを発生させる
                // 通常はすべてロールバックされるが、 id = 35まで登録されている.
                // throw new NotFoundHttpException();
            }
        }
        
        // auto commitを元に戻す
        $app['orm.em']->getConnection()->setAutoCommit(false);
        // トランザクションを開始する
        // このトランザクションは、TransactionListener::onKernelTerminateでcommitまたはrollbackされる
        $app['orm.em']->getConnection()->beginTransaction();
        
        return $app->render('index.twig');
    }


> 新たにコネクションを取得する方法もご存知でしたらご教示いただきたいです。

こんな感じのコードになります。
※Doctrineのドキュメントにありました。
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html


        // Doctrine/Ormのメタデータ設定を生成
        $config = \Doctrine\ORM\Tools\Setup::createYAMLMetadataConfiguration(array(
            $app['config']['root_dir'].'/src/Eccube/Resource/doctrine',
            $app['config']['root_dir'].'/src/Eccube/Resource/doctrine/master',
        ), $app['debug']);

        // 別コネクションでエンティティマネージャを生成
        $em = EntityManager::create($app['config']['database'], $config);

        // $app['eccube.repository.xxx']は既存のエンティティマネージャを使うので
        // レポジトリはgetRepositoryで個別に呼び出す必要がある
        $repository = $em->getRepository('Eccube\Entity\Master\Job');

        $job = $repository->find(1);
        dump($job);


フラット表示 前のトピック | 次のトピック


題名 投稿者 日時
   処理中に逐一DBに保存したい hmorita_j 2017/5/19 19:18
     Re: 処理中に逐一DBに保存したい nyorai 2017/5/22 12:45
       Re: 処理中に逐一DBに保存したい hmorita_j 2017/5/23 12:34
       » Re: 処理中に逐一DBに保存したい nyorai 2017/5/23 13:37
           Re: 処理中に逐一DBに保存したい hmorita_j 2017/5/23 14:02
             Re: 処理中に逐一DBに保存したい nyorai 2017/5/24 13:09

 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,982名です
総投稿数は110,019件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.