void begin(SharedGroup& sg, ClientHistory& history, BindingContext* context,
           bool validate_schema_changes)
{
    TransactLogObserver(context, sg, [&](auto&&... args) {
        LangBindHelper::promote_to_write(sg, history, std::move(args)...);
    }, validate_schema_changes);
}
void advance(SharedGroup& sg, TransactionChangeInfo& info, VersionID version)
{
    if (!info.track_all && info.table_modifications_needed.empty() && info.lists.empty()) {
        LangBindHelper::advance_read(sg, version);
    }
    else {
        LangBindHelper::advance_read(sg, TransactLogObserver(info), version);
    }

}
void cancel(SharedGroup& sg, ClientHistory& history, BindingContext* context)
{
    TransactLogObserver(context, sg, [&](auto&&... args) {
        LangBindHelper::rollback_and_continue_as_read(sg, history, std::move(args)...);
    }, false);
}
void advance(SharedGroup& sg, ClientHistory& history, BindingContext* context)
{
    TransactLogObserver(context, sg, [&](auto&&... args) {
        LangBindHelper::advance_read(sg, history, std::move(args)...);
    }, true);
}
void advance(SharedGroup& sg, BindingContext* context, SharedGroup::VersionID version)
{
    TransactLogObserver(context, sg, [&](auto&&... args) {
        LangBindHelper::advance_read(sg, std::move(args)..., version);
    }, true);
}