2015-06-03 4 views

ответ

8

A batch - это набор операций, которые отправляются на сервер как единое целое для повышения эффективности. Это эквивалентно отправке тех же операций, что и отдельные запросы из разных потоков. Запросы в пакете могут выполняться не по порядку, и некоторые операции в пакете возможны, если другие не работают.

In Go, партии создаются с дозирующим объектом 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") 

транзакция определяет последовательную и атомное последовательность операций. Транзакции гарантируют согласованность по отношению ко всем другим операциям в системе: результаты транзакции не могут быть видны до тех пор, пока транзакция не будет совершена. Поскольку транзакции, возможно, потребуется повторить, транзакции определяются объектами функций (обычно закрытие), которые могут быть вызваны несколько раз.

In Go, операции создаются с использованием метода DB.Tx. Параметр *client.Tx к закрытию реализует аналогичный интерфейс с DB; внутри транзакции вы должны выполнить все свои операции над этим объектом, а не с исходной БД. Если ваша функция возвращает ошибку, транзакция будет прервана; иначе он будет совершать. Вот транзакционный вариант предыдущего примера (но смотри ниже для более эффективной версии):

err := db.Tx(func(tx *client.Tx) error { 
    err := tx.Put("a", "1") 
    if err != nil { 
     return err 
    } 
    return tx.Put("b", "2") 
}) 

Предыдущий пример ждет на «а» писать, чтобы завершить перед запуском «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")) 
}) 
+0

вы должны отметить свой ответ как ответ, это будет весьма полезно –

Смежные вопросы