Skip to content

Commit 5df7036

Browse files
committed
sql: include isolation level in SHOW TRANSACTIONS, SHOW QUERIES, SHOW SESSIONS
This change adds isolation level information to the output of SHOW TRANSACTIONS, SHOW QUERIES, and SHOW SESSIONS commands. The isolation level is obtained from the session's active transaction information that is already collected by the underlying gRPC endpoints. Changes: - Added isolation_level column to SHOW TRANSACTIONS output - Updated crdb_internal.node_queries and cluster_queries table schemas to include isolation_level column - Updated populateQueriesTable to populate isolation level from session's active transaction, or fall back to session's default isolation level - Added isolation_level column to SHOW QUERIES output - Updated crdb_internal.node_sessions and cluster_sessions table schemas to include isolation_level column - Updated populateSessionsTable to populate isolation level from session's active transaction, or fall back to session's default isolation level - Added isolation_level column to SHOW SESSIONS output - Added default_isolation_level field to Session protobuf message - Modified session serialization to include the session's default isolation level The isolation level now displays the session's default isolation level when there is no active transaction, instead of NULL. This provides more useful information to users about the transaction isolation level that would be used for new transactions. Fixes #150779 Release note (sql change): SQL observability commands SHOW TRANSACTIONS, SHOW QUERIES, and SHOW SESSIONS now include an isolation_level column showing the isolation level of the active transaction, or the session's default isolation level when there is no active transaction.
1 parent 1aabeeb commit 5df7036

File tree

10 files changed

+131
-21
lines changed

10 files changed

+131
-21
lines changed

docs/generated/http/full.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,6 +2315,7 @@ Session represents one SQL session.
23152315
| trace_id | [uint64](#cockroach.server.serverpb.ListSessionsResponse-uint64) | | The ID of the session's active trace. It will be 0 if tracing is off. | [reserved](#support-status) |
23162316
| goroutine_id | [int64](#cockroach.server.serverpb.ListSessionsResponse-int64) | | The ID of the session's goroutine. | [reserved](#support-status) |
23172317
| authentication_method | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | | [reserved](#support-status) |
2318+
| default_isolation_level | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | The session's default transaction isolation level. | [reserved](#support-status) |
23182319

23192320

23202321

@@ -2465,6 +2466,7 @@ Session represents one SQL session.
24652466
| trace_id | [uint64](#cockroach.server.serverpb.ListSessionsResponse-uint64) | | The ID of the session's active trace. It will be 0 if tracing is off. | [reserved](#support-status) |
24662467
| goroutine_id | [int64](#cockroach.server.serverpb.ListSessionsResponse-int64) | | The ID of the session's goroutine. | [reserved](#support-status) |
24672468
| authentication_method | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | | [reserved](#support-status) |
2469+
| default_isolation_level | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | The session's default transaction isolation level. | [reserved](#support-status) |
24682470

24692471

24702472

pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,15 @@ SELECT * FROM crdb_internal.session_variables WHERE variable = ''
142142
----
143143
variable value hidden
144144

145-
query TTITTTTTTBTBTT colnames
145+
query TTITTTTTTBTBTTT colnames
146146
SELECT * FROM crdb_internal.node_queries WHERE node_id < 0
147147
----
148-
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database
148+
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database isolation_level
149149

150-
query TTITTTTTTBTBTT colnames
150+
query TTITTTTTTBTBTTT colnames
151151
SELECT * FROM crdb_internal.cluster_queries WHERE node_id < 0
152152
----
153-
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database
153+
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database isolation_level
154154

155155
query TITTTTIIITTTT colnames
156156
SELECT * FROM crdb_internal.node_transactions WHERE node_id < 0
@@ -162,15 +162,15 @@ SELECT * FROM crdb_internal.cluster_transactions WHERE node_id < 0
162162
----
163163
id node_id session_id start txn_string application_name num_stmts num_retries num_auto_retries last_auto_retry_reason isolation_level priority quality_of_service
164164

165-
query ITTTTTTTITTTIITTIII colnames
165+
query ITTTTTTTITTTIITTIIIT colnames
166166
SELECT * FROM crdb_internal.node_sessions WHERE node_id < 0
167167
----
168-
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method
168+
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method isolation_level
169169

170-
query ITTTTTTTITTTIITTIII colnames
170+
query ITTTTTTTITTTIITTIIIT colnames
171171
SELECT * FROM crdb_internal.cluster_sessions WHERE node_id < 0
172172
----
173-
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method
173+
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method isolation_level
174174

175175
query IIITTTI colnames
176176
SELECT * FROM crdb_internal.node_contention_events WHERE table_id < 0

pkg/ccl/logictestccl/testdata/logic_test/read_committed

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,82 @@ read committed
680680

681681
statement ok
682682
COMMIT
683+
684+
subtest show
685+
686+
# Test isolation level column in SHOW TRANSACTIONS, SHOW QUERIES, SHOW SESSIONS.
687+
688+
user testuser2
689+
690+
statement ok
691+
SET default_transaction_isolation = 'READ COMMITTED'
692+
693+
user testuser
694+
695+
statement ok
696+
SET default_transaction_isolation = 'READ COMMITTED'
697+
698+
query T rowsort
699+
SELECT isolation_level FROM [SHOW TRANSACTIONS]
700+
----
701+
READ COMMITTED
702+
703+
query TT colnames
704+
SELECT isolation_level, query FROM [SHOW QUERIES] ORDER BY isolation_level, query
705+
----
706+
isolation_level query
707+
READ COMMITTED SELECT isolation_level, query FROM [SHOW CLUSTER STATEMENTS] ORDER BY isolation_level, query
708+
709+
query TTT colnames
710+
SELECT DISTINCT isolation_level, user_name, active_queries FROM [SHOW SESSIONS]
711+
ORDER BY isolation_level, user_name, active_queries
712+
----
713+
isolation_level user_name active_queries
714+
READ COMMITTED testuser SELECT DISTINCT isolation_level, user_name, active_queries FROM [SHOW CLUSTER SESSIONS] ORDER BY isolation_level, user_name, active_queries
715+
READ COMMITTED testuser2 ·
716+
SERIALIZABLE root ·
717+
718+
statement ok
719+
SET default_transaction_isolation = 'SERIALIZABLE'
720+
721+
query TT colnames
722+
SELECT isolation_level, query FROM [SHOW QUERIES] ORDER BY isolation_level, query
723+
----
724+
isolation_level query
725+
SERIALIZABLE SELECT isolation_level, query FROM [SHOW CLUSTER STATEMENTS] ORDER BY isolation_level, query
726+
727+
# If there is no active query for a session, use the default transaction
728+
# isolation level. Otherwise, use the isolation level of the active query.
729+
query TTT colnames
730+
SELECT DISTINCT isolation_level, user_name, active_queries FROM [SHOW SESSIONS]
731+
ORDER BY isolation_level, user_name, active_queries
732+
----
733+
isolation_level user_name active_queries
734+
READ COMMITTED testuser2 ·
735+
SERIALIZABLE root ·
736+
SERIALIZABLE testuser SELECT DISTINCT isolation_level, user_name, active_queries FROM [SHOW CLUSTER SESSIONS] ORDER BY isolation_level, user_name, active_queries
737+
738+
statement ok
739+
BEGIN ISOLATION LEVEL READ COMMITTED
740+
741+
query TTT colnames
742+
SELECT DISTINCT isolation_level, user_name, active_queries FROM [SHOW SESSIONS]
743+
ORDER BY isolation_level, user_name, active_queries
744+
----
745+
isolation_level user_name active_queries
746+
READ COMMITTED testuser SELECT DISTINCT isolation_level, user_name, active_queries FROM [SHOW CLUSTER SESSIONS] ORDER BY isolation_level, user_name, active_queries
747+
READ COMMITTED testuser2 ·
748+
SERIALIZABLE root ·
749+
750+
statement ok
751+
COMMIT
752+
753+
statement ok
754+
RESET default_transaction_isolation
755+
756+
user testuser2
757+
758+
statement ok
759+
RESET default_transaction_isolation
760+
761+
subtest end

pkg/server/serverpb/status.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,9 @@ message Session {
11181118
string authentication_method = 22 [
11191119
(gogoproto.casttype) = "github.com/cockroachdb/redact.SafeString"
11201120
];
1121+
1122+
// The session's default transaction isolation level.
1123+
string default_isolation_level = 23;
11211124
}
11221125

11231126
// An error wrapper object for ListSessionsResponse.

pkg/sql/conn_executor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4534,6 +4534,7 @@ func (ex *connExecutor) serialize() serverpb.Session {
45344534
TraceID: uint64(ex.planner.extendedEvalCtx.Tracing.connSpan.TraceID()),
45354535
GoroutineID: ex.ctxHolder.goroutineID,
45364536
AuthenticationMethod: sd.AuthenticationMethod,
4537+
DefaultIsolationLevel: tree.IsolationLevel(sd.DefaultTxnIsolationLevel).String(),
45374538
}
45384539
}
45394540

pkg/sql/crdb_internal.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2249,7 +2249,8 @@ CREATE TABLE crdb_internal.%s (
22492249
phase STRING, -- the current execution phase
22502250
full_scan BOOL, -- whether the query contains a full table or index scan
22512251
plan_gist STRING, -- Compressed logical plan.
2252-
database STRING -- the database the statement was executed on
2252+
database STRING, -- the database the statement was executed on
2253+
isolation_level STRING -- the isolation level of the query's transaction
22532254
)`
22542255

22552256
func (p *planner) makeSessionsRequest(
@@ -2414,6 +2415,13 @@ func populateQueriesTable(
24142415
if shouldRedactOtherUserQuery && session.Username != p.SessionData().User().Normalized() {
24152416
sql = query.SqlNoConstants
24162417
}
2418+
2419+
// Get isolation level from session's active transaction, or use NULL if none.
2420+
var isolationLevelDatum tree.Datum = tree.DNull
2421+
if session.ActiveTxn != nil {
2422+
isolationLevelDatum = tree.NewDString(session.ActiveTxn.IsolationLevel)
2423+
}
2424+
24172425
if err := addRow(
24182426
tree.NewDString(query.ID),
24192427
txnID,
@@ -2429,6 +2437,7 @@ func populateQueriesTable(
24292437
isFullScanDatum,
24302438
planGistDatum,
24312439
tree.NewDString(query.Database),
2440+
isolationLevelDatum,
24322441
); err != nil {
24332442
return err
24342443
}
@@ -2455,6 +2464,7 @@ func populateQueriesTable(
24552464
tree.DNull, // full_scan
24562465
tree.DNull, // plan_gist
24572466
tree.DNull, // database
2467+
tree.DNull, // isolation_level
24582468
); err != nil {
24592469
return err
24602470
}
@@ -2510,7 +2520,8 @@ CREATE TABLE crdb_internal.%s (
25102520
pg_backend_pid INT, -- the numerical ID attached to the session which is used to mimic a Postgres backend PID
25112521
trace_id INT, -- the ID of the trace of the session
25122522
goroutine_id INT, -- the ID of the goroutine of the session
2513-
authentication_method STRING -- the method used to authenticate the session
2523+
authentication_method STRING, -- the method used to authenticate the session
2524+
isolation_level STRING -- the isolation level of the session's active transaction or default isolation level if no active transaction
25142525
)
25152526
`
25162527

@@ -2634,6 +2645,16 @@ func populateSessionsTable(
26342645
return err
26352646
}
26362647
}
2648+
2649+
// Get isolation level from session's active transaction, or fall back to
2650+
// default.
2651+
var isolationLevelDatum tree.Datum = tree.DNull
2652+
if session.ActiveTxn != nil {
2653+
isolationLevelDatum = tree.NewDString(session.ActiveTxn.IsolationLevel)
2654+
} else if session.DefaultIsolationLevel != "" {
2655+
isolationLevelDatum = tree.NewDString(session.DefaultIsolationLevel)
2656+
}
2657+
26372658
if err := addRow(
26382659
tree.NewDInt(tree.DInt(session.NodeID)),
26392660
sessionID,
@@ -2654,6 +2675,7 @@ func populateSessionsTable(
26542675
tree.NewDInt(tree.DInt(session.TraceID)),
26552676
tree.NewDInt(tree.DInt(session.GoroutineID)),
26562677
tree.NewDString(string(session.AuthenticationMethod)),
2678+
isolationLevelDatum,
26572679
); err != nil {
26582680
return err
26592681
}
@@ -2684,6 +2706,7 @@ func populateSessionsTable(
26842706
tree.DNull, // trace_id
26852707
tree.DNull, // goroutine_id
26862708
tree.DNull, // authentication_method
2709+
tree.DNull, // isolation_level
26872710
); err != nil {
26882711
return err
26892712
}

pkg/sql/delegate/show_queries.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ SELECT
2525
application_name,
2626
distributed,
2727
full_scan,
28-
phase
28+
phase,
29+
isolation_level
2930
FROM crdb_internal.`
3031
table := `node_queries`
3132
if n.Cluster {

pkg/sql/delegate/show_sessions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414

1515
func (d *delegator) delegateShowSessions(n *tree.ShowSessions) (tree.Statement, error) {
1616
columns := `node_id, session_id, status, user_name, authentication_method, client_address, application_name, active_queries,
17-
last_active_query, session_start, active_query_start, num_txns_executed, trace_id, goroutine_id`
17+
last_active_query, session_start, active_query_start, num_txns_executed, trace_id, goroutine_id, isolation_level`
1818

1919
query := fmt.Sprintf(`SELECT %s FROM crdb_internal.`, columns)
2020
table := `node_sessions`

pkg/sql/delegate/show_transactions.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ SELECT
1919
num_stmts,
2020
num_retries,
2121
num_auto_retries,
22-
last_auto_retry_reason
22+
last_auto_retry_reason,
23+
isolation_level
2324
FROM `
2425
table := `"".crdb_internal.node_transactions`
2526
if n.Cluster {

pkg/sql/logictest/testdata/logic_test/crdb_internal

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -276,15 +276,15 @@ SELECT * FROM crdb_internal.session_variables WHERE variable = ''
276276
----
277277
variable value hidden
278278

279-
query TTITTTTTTBTBTT colnames
279+
query TTITTTTTTBTBTTT colnames
280280
SELECT * FROM crdb_internal.node_queries WHERE node_id < 0
281281
----
282-
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database
282+
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database isolation_level
283283

284-
query TTITTTTTTBTBTT colnames
284+
query TTITTTTTTBTBTTT colnames
285285
SELECT * FROM crdb_internal.cluster_queries WHERE node_id < 0
286286
----
287-
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database
287+
query_id txn_id node_id session_id user_name start query client_address application_name distributed phase full_scan plan_gist database isolation_level
288288

289289
query TITTTTIIITTTT colnames
290290
SELECT * FROM crdb_internal.node_transactions WHERE node_id < 0
@@ -349,15 +349,15 @@ user root
349349
statement ok
350350
REVOKE SYSTEM VIEWACTIVITYREDACTED FROM testuser
351351

352-
query ITTTTTTTITTTIITTIII colnames
352+
query ITTTTTTTITTTIITTIIIT colnames
353353
SELECT * FROM crdb_internal.node_sessions WHERE node_id < 0
354354
----
355-
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method
355+
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method isolation_level
356356

357-
query ITTTTTTTITTTIITTIII colnames
357+
query ITTTTTTTITTTIITTIIIT colnames
358358
SELECT * FROM crdb_internal.cluster_sessions WHERE node_id < 0
359359
----
360-
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method
360+
node_id session_id user_name client_address application_name active_queries last_active_query num_txns_executed session_start active_query_start kv_txn alloc_bytes max_alloc_bytes status session_end pg_backend_pid trace_id goroutine_id authentication_method isolation_level
361361

362362
query IIITTTI colnames
363363
SELECT * FROM crdb_internal.node_contention_events WHERE table_id < 0

0 commit comments

Comments
 (0)