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