0

innoDB ベースのデータベースを使用しています。トランザクションを使用してデータを保存する方法。

ユーザーの配列があります。ただし、データベースの最後のレコードのみを保存します。データを複数のテーブルに保存する必要があり、それらすべてが相互に関連しているため、saveAll は使用できません。

データベースには膨大な数のエントリがあるため、モデルの関連付けを定義することさえできません。したがって、毎回 join が実行されます。

トランザクションの概念をどのように使用できるか教えてください。

4

1 に答える 1

3

すべてのトランザクションは、現在の DataSource オブジェクトで実行されます。

まず、(モデルで)それを取得する必要があります:

$dataSrc = $this->getDataSource();

このメソッドは、現在モデルにバインドされている DataSource オブジェクトを返します。

次に、DataSource オブジェクトのメソッドを使用して、トランザクションを開始、コミット、またはロールバックできます。

$dataSrc->begin();
//Do something 

if (/*Everything is nice?*/) {
    $dataSrc->commit();
} else {
    //Bad things have happened
    $dataSrc->rollback();
}

もちろん、独自のロジックを実装する必要があります。Cake 2.2以降では、実際のネストされたトランザクションも実行できますウィキペディアによると、「ネストされたトランザクション」は次のとおりです。

ネストされたトランザクションは、既存のトランザクション内に既にある命令によって新しいトランザクションが開始されたときに発生します。新しいトランザクションは、既存のトランザクション内にネストされていると言われるため、この用語が使われています。ネストされたトランザクションは、データベースごとに異なる方法で実装されます。ただし、最も外側のトランザクションがコミットされるまで、無関係なトランザクションには変更が表示されないという共通点があります。これは、内部トランザクションのコミットがデータベースへの更新を保持する必要がないことを意味します。

もちろん、これはすべて、使用しているデータベースに依存しています。MySQL InnoDBトランザクションストレージ エンジンは、トランザクションをサポートしています。

そして、このコメントに対する別の説明:

はい、コントローラーで $this->Model->saveAll($this->request->data, array('deep' => true) を使用しています。これは foreach ループの下に記述されています。最後の foreach レコードのみデータベースに保存されます. – Arun Jain

$this->Model->saveAll();ループで実行する必要はありません! 「自動的に」物事を管理します。ループから外します。さらに、saveAll() でデータを保存するのではなく、トランザクションに関する質問でした。Model::saveAll()は、 saveMany()saveAssociated( )の単なるラッパーです。モデルの関連付けのタイプに応じて、使用するメソッドが選択されます。

Cake Bookを読んでください。そこにはすべて非常によく説明されています...

于 2012-07-04T07:25:45.137 に答える