diff --git a/session/session.go b/session/session.go index a992f27e85dc2..8912f55795c84 100644 --- a/session/session.go +++ b/session/session.go @@ -664,12 +664,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { if err != nil { return err } - pessTxnConf := config.GetGlobalConfig().PessimisticTxn - if pessTxnConf.Enable { - if s.sessionVars.TxnMode == ast.Pessimistic { - s.sessionVars.TxnCtx.IsPessimistic = true - } - } + s.sessionVars.SetStatusFlag(mysql.ServerStatusInTrans, true) } else { s.PrepareTxnCtx(ctx) } diff --git a/session/session_test.go b/session/session_test.go index 806ed82f44ec3..96670b909aa37 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -3486,3 +3486,85 @@ func (s *testSessionSerialSuite) TestProcessInfoIssue22068(c *C) { c.Assert(pi.Plan, IsNil) wg.Wait() } + +func (s *testSessionSuite2) TestNonAutocommitTxnRetry(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("drop table if exists t") + tk1.MustExec("create table t(pk varchar(50), c1 varchar(50), c2 varchar(50), key k1(c1, c2), primary key(pk))") + tk1.MustExec("insert into t values ('1', '10', '100')") + + tk1.MustExec("set tidb_disable_txn_auto_retry = 0") + tk1.MustExec("set autocommit = 0") + tk1.MustExec("set tidb_txn_mode = ''") + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("update t set c1 = '11' where pk = '1'") + tk1.MustExec("update t set c2 = '101' where pk = '1'") + tk2.MustExec("begin optimistic") + tk2.MustQuery("select * from t for update").Check(testkit.Rows("1 10 100")) + tk2.MustExec("commit") + tk1.MustExec("commit") + tk2.MustExec("admin check table t") + tk2.MustQuery("select * from t use index(k1)").Check(testkit.Rows("1 11 101")) + tk2.MustQuery("select * from t where pk = '1'").Check(testkit.Rows("1 11 101")) +} + +func (s *testSessionSuite2) TestAutocommitTxnRetry(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("drop table if exists t") + tk1.MustExec("create table t(pk varchar(50), c1 varchar(50), c2 varchar(50), key k1(c1, c2), primary key(pk))") + tk1.MustExec("insert into t values ('1', '10', '100')") + + tk1.MustExec("set tidb_disable_txn_auto_retry = 0") + tk1.MustExec("set autocommit = 0") + tk1.MustExec("begin optimistic") + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("update t set c1 = '11' where pk = '1'") + tk1.MustExec("update t set c2 = '101' where pk = '1'") + tk2.MustExec("begin optimistic") + tk2.MustQuery("select * from t for update").Check(testkit.Rows("1 10 100")) + tk2.MustExec("commit") + tk1.MustExec("commit") + tk2.MustExec("admin check table t") + tk2.MustQuery("select * from t use index(k1)").Check(testkit.Rows("1 11 101")) + tk2.MustQuery("select * from t where pk = '1'").Check(testkit.Rows("1 11 101")) +} + +func (s *testSessionSuite2) TestRetryWithSet(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("drop table if exists t") + tk1.MustExec("create table t(pk varchar(50), c1 bigint, c2 varchar(50), key k1(c1, c2), primary key(pk))") + tk1.MustExec("insert into t values ('1', '10', '100')") + + tk1.MustExec("set tidb_disable_txn_auto_retry = 0") + tk1.MustExec("set autocommit = 0") + tk1.MustQuery("select * from t").Check(testkit.Rows("1 10 100")) + tk1.MustExec("set @a=@@tidb_current_ts") + tk1.MustExec("update t set c1 = @a where pk = '1'") + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk2.MustExec("begin optimistic") + tk2.MustQuery("select * from t for update").Check(testkit.Rows("1 10 100")) + tk2.MustExec("commit") + tk1.MustExec("commit") + tk1.MustQuery("select c1 > 0 from t").Check(testkit.Rows("1")) +} + +func (s *testSessionSuite2) TestRetryCommitWithSet(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("drop table if exists t") + tk1.MustExec("create table t(pk varchar(50), c1 varchar(50), c2 varchar(50), key k1(c1, c2), primary key(pk))") + tk1.MustExec("insert into t values ('1', '10', '100')") + + tk1.MustExec("set tidb_disable_txn_auto_retry = 0") + tk1.MustExec("set autocommit = 0") + tk1.MustExec("set tidb_txn_mode = ''") + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("update t set c1 = '11' where pk = '1'") + tk1.MustExec("update t set c2 = '101' where pk = '1'") + tk2.MustExec("begin optimistic") + tk2.MustQuery("select * from t for update").Check(testkit.Rows("1 10 100")) + tk2.MustExec("commit") + tk1.MustExec("set autocommit = 1") + tk2.MustExec("admin check table t") + tk2.MustQuery("select * from t use index(k1)").Check(testkit.Rows("1 11 101")) + tk2.MustQuery("select * from t where pk = '1'").Check(testkit.Rows("1 11 101")) +}