5#include <userver/tracing/span.hpp>
6#include <userver/utils/fast_pimpl.hpp>
7#include <userver/utils/trx_tracker.hpp>
9#include <userver/storages/mysql/cluster_host_type.hpp>
10#include <userver/storages/mysql/command_result_set.hpp>
11#include <userver/storages/mysql/cursor_result_set.hpp>
12#include <userver/storages/mysql/impl/bind_helper.hpp>
13#include <userver/storages/mysql/options.hpp>
14#include <userver/storages/mysql/query.hpp>
15#include <userver/storages/mysql/statement_result_set.hpp>
17USERVER_NAMESPACE_BEGIN
19namespace storages::
mysql {
30class Transaction
final {
32 explicit Transaction(infra::ConnectionPtr&& connection, engine::Deadline deadline);
34 Transaction(
const Transaction& other) =
delete;
35 Transaction(Transaction&& other)
noexcept;
44 template <
typename... Args>
45 StatementResultSet
Execute(
const Query& query,
const Args&... args)
const;
70 template <
typename Container>
71 StatementResultSet
ExecuteBulk(
const Query& query,
const Container& params)
const;
88 template <
typename MapTo,
typename Container>
90 const Container& params)
const;
100 StatementResultSet DoExecute(
const Query& query, impl::io::ParamsBinderBase& params)
const;
102 void AssertValid()
const;
104 utils::FastPimpl<infra::ConnectionPtr, 24, 8> connection_;
105 engine::Deadline deadline_;
107 utils::trx_tracker::TransactionLock trx_lock_;
110template <
typename... Args>
111StatementResultSet Transaction::
Execute(
const Query& query,
const Args&... args)
const {
112 auto params_binder = impl::BindHelper::BindParams(args...);
114 return DoExecute(query, params_binder);
119 auto params_binder = impl::BindHelper::BindRowAsParams(row);
121 return DoExecute(query, params_binder);
124template <
typename Container>
125StatementResultSet Transaction::
ExecuteBulk(
const Query& query,
const Container& params)
const {
126 UINVARIANT(!params.empty(),
"Empty params in bulk execution");
128 auto params_binder = impl::BindHelper::BindContainerAsParams(params);
130 return DoExecute(query, params_binder);
133template <
typename MapTo,
typename Container>
134StatementResultSet Transaction::
ExecuteBulkMapped(
const Query& query,
const Container& params)
const {
135 UINVARIANT(!params.empty(),
"Empty params in bulk execution");
137 auto params_binder = impl::BindHelper::BindContainerAsParamsMapped<MapTo>(params);
139 return DoExecute(query, params_binder);