2013-07-04 9 views
9

Google App Engineでは、トランザクションの分離はSNAPSHOT分離と呼ばれ、トランザクション自体の中に前回の削除やプットは表示されず、トランザクションが開始されたときのデータストアの状態のみが表示されます(https://developers.google.com/appengine/docs/python/datastore/transactions )。古い記事では、トランザクションレベルは実際にはシリアル化可能です(https://developers.google.com/appengine/articles/transaction_isolation)。Googleのアプリケーションエンジンでのトランザクションの分離

Google Test Compatibility Kit(TCK)は実際にSNAPSHOTの分離であることを示していますが、前述の記事では「トランザクションの内側では、分離レベルはデフォルトでSNAPSHOTです。 SERIALIZABLE "である。

私の質問は、どのようにして分離レベルを直列化できるようにするのですか?

+1

良い質問ですが、文書化されていません。 –

+0

GAEドキュメントに何か記載されていませんか?ショッキング。少なくとも、GAEのチームメンバーが質問に答えた場合、誰かがGoogle検索でそれを見つけることができます。 –

+0

@RomanLevin私はそれほどショックを受けていません...データストアのAPIを受け入れました。受け入れられた回答の参照リンクが機能しなくなりました(衝撃的ではありません) – themihai

答えて

3

BeginTransaction API Referenceで分離レベルを変更する方法がわかります。現在のところ、Google Cloud Datastore HTTP APIでのみ設定可能で、すべてのApp Engine SDKではデフォルトでSERIALIZABLEに設定されています。しかし、私はこれがあなたがしたいことをするとは思わない。

SNAPSHOTとSERIALIZABLEは、トランザクションの分離または並行トランザクションの相互作用を制御します。トランザクションとのやりとりを制御するものではありません(システムによっては、これら2つのものが統合されています)。

データストアでは、SERIALIZABLEを設定しても、トランザクションは独自のコミットされていない突然変異を認識します。シリアライズ時に読み書きパターンが有効でない場合、同時トランザクションが衝突することを意味します。たとえば、次の2つのトランザクションが必ずしもSERIALIZABLE分離を使用する場合に衝突する。これらの二つの順序のどちらとして

TX1: READ A, WRITE B' 
TX2: READ B, WRITE A' 

が可能である:

READ A, WRITE B', READ B (conflict), WRITE A' 
READ B, WRITE A', READ A (conflict), WRITE B' 

しかしながら、これらの取引は、必ずしもスナップショット分離と衝突しないであろう。

SNAPSHOTとSERIALIZABLEの両方がデータのスナップショットから読み取られます。トランザクションの実行中にトランザクション分離保証と競合するようにデータが変更された場合と同様に、トランザクションはコミットできません。

関連する問題