@@ -284,7 +284,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
284284 }
285285 QueryState->TxCtx = std::move (txCtx);
286286 QueryState->QueryData = std::make_shared<TQueryData>(QueryState->TxCtx ->TxAlloc );
287- QueryState->TxId = txId;
287+ QueryState->TxId . SetValue ( txId) ;
288288 if (!CheckTransactionLocks (/* tx*/ nullptr )) {
289289 return ;
290290 }
@@ -540,6 +540,10 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
540540
541541 void Handle (TEvKqp::TEvParseResponse::TPtr& ev) {
542542 QueryState->SaveAndCheckParseResult (std::move (*ev->Get ()));
543+ Ydb::Table::TransactionSettings settings;
544+ settings.mutable_serializable_read_write ();
545+ BeginTx (settings);
546+ QueryState->ImpliedTxId = QueryState->TxId ;
543547 CompileStatement ();
544548 }
545549
@@ -680,7 +684,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
680684 }
681685
682686 void BeginTx (const Ydb::Table::TransactionSettings& settings) {
683- QueryState->TxId = UlidGen.Next ();
687+ QueryState->TxId . SetValue ( UlidGen.Next () );
684688 QueryState->TxCtx = MakeIntrusive<TKqpTransactionContext>(false , AppData ()->FunctionRegistry ,
685689 AppData ()->TimeProvider , AppData ()->RandomProvider , Config->EnableKqpImmediateEffects );
686690
@@ -704,7 +708,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
704708 QueryState->TxCtx ->SetIsolationLevel (settings);
705709 QueryState->TxCtx ->OnBeginQuery ();
706710
707- if (!Transactions.CreateNew (QueryState->TxId , QueryState->TxCtx )) {
711+ if (!Transactions.CreateNew (QueryState->TxId . GetValue () , QueryState->TxCtx )) {
708712 std::vector<TIssue> issues{
709713 YqlIssue ({}, TIssuesIds::KIKIMR_TOO_MANY_TRANSACTIONS)};
710714 ythrow TRequestFail (Ydb::StatusIds::BAD_SESSION,
@@ -717,14 +721,14 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
717721 Counters->ReportBeginTransaction (Settings.DbCounters , Transactions.EvictedTx , Transactions.Size (), Transactions.ToBeAbortedSize ());
718722 }
719723
720- static const Ydb::Table::TransactionControl& GetImpliedTxControl () {
721- auto create = []() -> Ydb::Table::TransactionControl {
722- Ydb::Table::TransactionControl control;
724+ Ydb::Table::TransactionControl GetImpliedTxControl () {
725+ Ydb::Table::TransactionControl control;
726+ control.set_commit_tx (QueryState->ProcessingLastStatement ());
727+ if (QueryState->ImpliedTxId ) {
728+ control.set_tx_id (QueryState->ImpliedTxId ->GetValue ().GetHumanStr ());
729+ } else {
723730 control.mutable_begin_tx ()->mutable_serializable_read_write ();
724- control.set_commit_tx (true );
725- return control;
726- };
727- static const Ydb::Table::TransactionControl control = create ();
731+ }
728732 return control;
729733 }
730734
@@ -744,14 +748,16 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
744748 }
745749 QueryState->TxCtx = txCtx;
746750 QueryState->QueryData = std::make_shared<TQueryData>(QueryState->TxCtx ->TxAlloc );
747- QueryState->TxId = txId;
751+ if (QueryState->TxId .GetValue () != txId) {
752+ QueryState->TxId .SetValue (txId);
753+ }
748754 break ;
749755 }
750756 case Ydb::Table::TransactionControl::kBeginTx : {
751757 BeginTx (txControl.begin_tx ());
752758 break ;
753- }
754- case Ydb::Table::TransactionControl::TX_SELECTOR_NOT_SET:
759+ }
760+ case Ydb::Table::TransactionControl::TX_SELECTOR_NOT_SET:
755761 ythrow TRequestFail (Ydb::StatusIds::BAD_REQUEST)
756762 << " wrong TxControl: tx_selector must be set" ;
757763 break ;
@@ -1539,7 +1545,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
15391545
15401546 void FillTxInfo (NKikimrKqp::TQueryResponse* response) {
15411547 YQL_ENSURE (QueryState);
1542- response->MutableTxMeta ()->set_id (QueryState->TxId .GetHumanStr ());
1548+ response->MutableTxMeta ()->set_id (QueryState->TxId .GetValue (). GetHumanStr ());
15431549
15441550 if (QueryState->TxCtx ) {
15451551 auto txInfo = QueryState->TxCtx ->GetInfo ();
@@ -1612,8 +1618,8 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
16121618
16131619 if (QueryState->Commit ) {
16141620 ResetTxState ();
1615- Transactions.ReleaseTransaction (QueryState->TxId );
1616- QueryState->TxId = TTxId ();
1621+ Transactions.ReleaseTransaction (QueryState->TxId . GetValue () );
1622+ QueryState->TxId . Reset ();
16171623 }
16181624
16191625 FillTxInfo (response);
@@ -1958,7 +1964,7 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
19581964 auto & txCtx = QueryState->TxCtx ;
19591965 if (txCtx->IsInvalidated ()) {
19601966 Transactions.AddToBeAborted (txCtx);
1961- Transactions.ReleaseTransaction (QueryState->TxId );
1967+ Transactions.ReleaseTransaction (QueryState->TxId . GetValue () );
19621968 }
19631969 DiscardPersistentSnapshot (txCtx->SnapshotHandle );
19641970 }
0 commit comments