userver: userver/ydb/transaction.hpp Source File
Loading...
Searching...
No Matches
transaction.hpp
1#pragma once
2
3#include <string>
4
5#include <ydb-cpp-sdk/client/query/client.h>
6#include <ydb-cpp-sdk/client/table/table.h>
7
8#include <userver/tracing/span.hpp>
9#include <userver/utils/trx_tracker.hpp>
10
11#include <userver/ydb/builder.hpp>
12#include <userver/ydb/exceptions.hpp>
13#include <userver/ydb/impl/stats_scope.hpp>
14#include <userver/ydb/query.hpp>
15#include <userver/ydb/response.hpp>
16#include <userver/ydb/settings.hpp>
17
18USERVER_NAMESPACE_BEGIN
19
20namespace ydb {
21
22/// @brief YDB Transaction
23///
24/// https://ydb.tech/docs/en/concepts/transactions
25class Transaction final {
26public:
27 Transaction(Transaction&&) noexcept = default;
28 Transaction(const Transaction&) = delete;
29 Transaction& operator=(Transaction&&) = delete;
30 Transaction& operator=(const Transaction&) = delete;
31 ~Transaction();
32
33 /// Execute a single data query as a part of the transaction. Query parameters
34 /// are passed in `Args` as "string key - value" pairs:
35 ///
36 /// @code
37 /// client.ExecuteDataQuery(query, "name1", value1, "name2", value2, ...);
38 /// @endcode
39 ///
40 /// Use ydb::PreparedArgsBuilder for storing a generic buffer of query params
41 /// if needed.
42 ///
43 /// @{
44 template <typename... Args>
45 ExecuteResponse Execute(const Query& query, Args&&... args);
46
47 template <typename... Args>
48 ExecuteResponse Execute(OperationSettings settings, const Query& query, Args&&... args);
49
50 ExecuteResponse Execute(OperationSettings settings, const Query& query, PreparedArgsBuilder&& builder);
51
52 ExecuteResponse Execute(
53 QuerySettings query_settings,
54 OperationSettings settings,
55 const Query& query,
56 PreparedArgsBuilder&& builder
57 );
58 /// @}
59
60 /// Commit the transaction. The options that are missing in `settings` are
61 /// taken from the static config or driver defaults. `settings` can be
62 /// overridden by dynamic config's options for `Commit` "query".
63 void Commit(OperationSettings settings = {});
64
65 /// Rollback the transaction. The operation settings are taken from `Begin`
66 /// settings.
67 void Rollback();
68
69 PreparedArgsBuilder GetBuilder() const;
70
71 /// @cond
72 // For internal use only.
73 Transaction(
74 TableClient& table_client,
75 std::variant<NYdb::NQuery::TTransaction, NYdb::NTable::TTransaction> ydb_tx,
76 std::string name,
77 OperationSettings&& rollback_settings
78 ) noexcept;
79 /// @endcond
80
81private:
82 void MarkError() noexcept;
83 auto ErrorGuard();
84
85 void EnsureActive() const;
86
87 TableClient& table_client_;
88 std::string name_;
89 impl::StatsScope stats_scope_;
90 tracing::Span span_;
91 std::variant<NYdb::NQuery::TTransaction, NYdb::NTable::TTransaction> ydb_tx_;
92 OperationSettings rollback_settings_;
93 bool is_active_{true};
94 utils::trx_tracker::TransactionLock trx_lock_;
95};
96
97template <typename... Args>
98ExecuteResponse Transaction::Execute(const Query& query, Args&&... args) {
99 auto builder = GetBuilder();
100 builder.AddParams(std::forward<Args>(args)...);
101 return Execute(OperationSettings{}, query, std::move(builder));
102}
103
104template <typename... Args>
105ExecuteResponse Transaction::Execute(OperationSettings settings, const Query& query, Args&&... args) {
106 auto builder = GetBuilder();
107 builder.AddParams(std::forward<Args>(args)...);
108 return Execute(std::move(settings), query, std::move(builder));
109}
110
111} // namespace ydb
112
113USERVER_NAMESPACE_END