いつバッチを使用し、いつトランザクションを使用する必要がありますか? トランザクションをバッチに埋め込むことはできますか? トランザクション内のバッチ?
1 に答える
バッチは、効率化のために 1 つの単位としてサーバーに送信される操作の集合です。これは、同じ操作を異なるスレッドから個々の要求として送信することと同じです。バッチ内の要求は順不同で実行される可能性があり、バッチ内の一部の操作が成功し、他の操作が失敗する可能性があります。
Go では、バッチは batcher オブジェクトDB.B
で作成され、 に渡される必要がありますDB.Run()
。例えば:
err := db.Run(db.B.Put("a", "1").Put("b", "2"))
次と同等です。
_, err1 := db.Put("a", "1")
_, err2 := db.Put("b", "2")
トランザクションは、一貫したアトミックな一連の操作を定義します。トランザクションは、システム内の他のすべての操作に関して一貫性を保証します。トランザクションがコミットされない限り、トランザクションの結果を見ることはできません。トランザクションを再試行する必要がある場合があるため、トランザクションは、複数回呼び出される関数オブジェクト (通常はクロージャー) によって定義されます。
Go では、トランザクションはDB.Txメソッドで作成されます。*client.Tx
クロージャーへのパラメーターは、同様のインターフェイスを実装しますDB
。トランザクション内では、元の DB ではなく、このオブジェクトに対してすべての操作を実行する必要があります。関数がエラーを返した場合、トランザクションは中止されます。それ以外の場合はコミットします。前の例のトランザクション バージョンを次に示します (ただし、より効率的なバージョンについては以下を参照してください)。
err := db.Tx(func(tx *client.Tx) error {
err := tx.Put("a", "1")
if err != nil {
return err
}
return tx.Put("b", "2")
})
前の例では、「a」書き込みが完了するのを待ってから「b」書き込みを開始し、「b」書き込みが完了するのを待ってからトランザクションをコミットします。トランザクション内でバッチを使用することで、これをより効率的にすることができます。Tx.B
と同じように、バッチャー オブジェクトDB.B
です。Tx.Run
トランザクションでは、 または のいずれかを使用してバッチを実行できますTx.Commit
。Tx.Commit
バッチ内の他のすべての操作が成功した場合にのみトランザクションをコミットし、クロージャーが返されたときにトランザクションを自動的にコミットさせるよりも効率的です。常にトランザクションの最後の操作を によって実行されるバッチにすることをお勧めしTx.Commit
ます。
err := db.Tx(func(tx *client.Tx) error {
return tx.Commit(tx.B.Put("a", "1").Put("b", "2"))
})