From 14f9065b3b6aec5d0593c10f5c4a99bcd5350fac Mon Sep 17 00:00:00 2001 From: zyguan Date: Fri, 16 Dec 2022 08:57:30 +0000 Subject: [PATCH 1/2] planner: fix pessimistic-auto-commit not working for point plans Signed-off-by: zyguan --- planner/core/point_get_plan.go | 3 ++- tests/realtikvtest/pessimistictest/pessimistic_test.go | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/planner/core/point_get_plan.go b/planner/core/point_get_plan.go index de69438257f4e..41fe03403d11c 100644 --- a/planner/core/point_get_plan.go +++ b/planner/core/point_get_plan.go @@ -22,6 +22,7 @@ import ( "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -608,7 +609,7 @@ func getLockWaitTime(ctx sessionctx.Context, lockInfo *ast.SelectLockInfo) (lock // autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked. // See https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html sessVars := ctx.GetSessionVars() - if !sessVars.IsAutocommit() || sessVars.InTxn() { + if !sessVars.IsAutocommit() || sessVars.InTxn() || config.GetGlobalConfig().PessimisticTxn.PessimisticAutoCommit.Load() { lock = true waitTime = sessVars.LockWaitTimeout if lockInfo.LockType == ast.SelectLockForUpdateWaitN { diff --git a/tests/realtikvtest/pessimistictest/pessimistic_test.go b/tests/realtikvtest/pessimistictest/pessimistic_test.go index 0383272f8b1ed..b69f65bff3091 100644 --- a/tests/realtikvtest/pessimistictest/pessimistic_test.go +++ b/tests/realtikvtest/pessimistictest/pessimistic_test.go @@ -3074,13 +3074,17 @@ func TestPessimisticAutoCommitTxn(t *testing.T) { tk.MustExec("set tidb_txn_mode = 'pessimistic'") tk.MustExec("drop table if exists t") - tk.MustExec("create table t (i int)") + tk.MustExec("create table t (i int primary key)") tk.MustExec("insert into t values (1)") tk.MustExec("set autocommit = on") rows := tk.MustQuery("explain update t set i = -i").Rows() explain := fmt.Sprintf("%v", rows[1]) require.NotRegexp(t, ".*SelectLock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i = -1").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:-1.*", explain) + require.NotRegexp(t, ".*handle:-1, lock.*", explain) originCfg := config.GetGlobalConfig() defer config.StoreGlobalConfig(originCfg) @@ -3091,6 +3095,9 @@ func TestPessimisticAutoCommitTxn(t *testing.T) { rows = tk.MustQuery("explain update t set i = -i").Rows() explain = fmt.Sprintf("%v", rows[1]) require.Regexp(t, ".*SelectLock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i = -1").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:-1, lock.*", explain) } func TestPessimisticLockOnPartition(t *testing.T) { From 08a5d40159d39f470392feff5f11065c8ee73089 Mon Sep 17 00:00:00 2001 From: zyguan Date: Fri, 16 Dec 2022 10:56:19 +0000 Subject: [PATCH 2/2] address https://github.com/pingcap/tidb/pull/39993#discussion_r1050541556 Signed-off-by: zyguan --- tests/realtikvtest/pessimistictest/pessimistic_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/realtikvtest/pessimistictest/pessimistic_test.go b/tests/realtikvtest/pessimistictest/pessimistic_test.go index b69f65bff3091..ae7545e0e91f6 100644 --- a/tests/realtikvtest/pessimistictest/pessimistic_test.go +++ b/tests/realtikvtest/pessimistictest/pessimistic_test.go @@ -3085,6 +3085,10 @@ func TestPessimisticAutoCommitTxn(t *testing.T) { explain = fmt.Sprintf("%v", rows[1]) require.Regexp(t, ".*handle:-1.*", explain) require.NotRegexp(t, ".*handle:-1, lock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i in (-1, 1)").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:\\[-1 1\\].*", explain) + require.NotRegexp(t, ".*handle:\\[-1 1\\].*, lock.*", explain) originCfg := config.GetGlobalConfig() defer config.StoreGlobalConfig(originCfg) @@ -3098,6 +3102,9 @@ func TestPessimisticAutoCommitTxn(t *testing.T) { rows = tk.MustQuery("explain update t set i = -i where i = -1").Rows() explain = fmt.Sprintf("%v", rows[1]) require.Regexp(t, ".*handle:-1, lock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i in (-1, 1)").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:\\[-1 1\\].*, lock.*", explain) } func TestPessimisticLockOnPartition(t *testing.T) {