diff --git a/ydb/core/kqp/common/kqp_tx.cpp b/ydb/core/kqp/common/kqp_tx.cpp index 519995c69179..0e1b96aa1511 100644 --- a/ydb/core/kqp/common/kqp_tx.cpp +++ b/ydb/core/kqp/common/kqp_tx.cpp @@ -136,7 +136,8 @@ bool NeedSnapshot(const TKqpTransactionContext& txCtx, const NYql::TKikimrConfig { Y_UNUSED(config); - if (*txCtx.EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_SERIALIZABLE) + if (*txCtx.EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_SERIALIZABLE && + *txCtx.EffectiveIsolationLevel != NKikimrKqp::ISOLATION_LEVEL_SNAPSHOT_RO) return false; if (txCtx.GetSnapshot().IsValid()) diff --git a/ydb/core/kqp/common/kqp_tx.h b/ydb/core/kqp/common/kqp_tx.h index a668c0ea4977..af3ff88c35dc 100644 --- a/ydb/core/kqp/common/kqp_tx.h +++ b/ydb/core/kqp/common/kqp_tx.h @@ -212,8 +212,7 @@ class TKqpTransactionContext : public NYql::TKikimrTransactionContextBase { break; case Ydb::Table::TransactionSettings::kSnapshotReadOnly: - // TODO: (KIKIMR-3374) Use separate isolation mode to avoid optimistic locks. - EffectiveIsolationLevel = NKikimrKqp::ISOLATION_LEVEL_SERIALIZABLE; + EffectiveIsolationLevel = NKikimrKqp::ISOLATION_LEVEL_SNAPSHOT_RO; Readonly = true; break; diff --git a/ydb/core/kqp/executer_actor/kqp_planner.cpp b/ydb/core/kqp/executer_actor/kqp_planner.cpp index e6699c72e2b3..6eaacf2294d3 100644 --- a/ydb/core/kqp/executer_actor/kqp_planner.cpp +++ b/ydb/core/kqp/executer_actor/kqp_planner.cpp @@ -179,8 +179,8 @@ std::unique_ptr TKqpPlanner::SerializeReque request.SetTxId(TxId); if (LockTxId) { request.SetLockTxId(*LockTxId); + request.SetLockNodeId(LockNodeId); } - request.SetLockNodeId(LockNodeId); ActorIdToProto(ExecuterId, request.MutableExecuterActorId()); if (Deadline) { diff --git a/ydb/core/protos/kqp.proto b/ydb/core/protos/kqp.proto index a7e396ae5735..34fea9093cdd 100644 --- a/ydb/core/protos/kqp.proto +++ b/ydb/core/protos/kqp.proto @@ -64,6 +64,7 @@ enum EIsolationLevel { ISOLATION_LEVEL_READ_COMMITTED = 2; ISOLATION_LEVEL_READ_UNCOMMITTED = 3; ISOLATION_LEVEL_READ_STALE = 4; + ISOLATION_LEVEL_SNAPSHOT_RO = 5; }; enum EQueryReplyFlags {