tidb now() 函数问题

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 Bug 的影响】
tidb数据库中的time字段不能实时更新

【可能的问题复现步骤】
使用go语言从proxysql层连接tidb数据库,执行update操作,其中time字段只更新一次后面就不更新了。

表结构
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL,
  `password` varchar(256) DEFAULT NULL,
  `salt` varchar(256) DEFAULT NULL,
  `denied_count` int(11) NOT NULL,
  `admin_flag` int(11) NOT NULL DEFAULT 0,
  `denied_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `creation_time` datetime NOT NULL,
  `channel` int(11) NOT NULL DEFAULT 1,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_channel` (`username`,`channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=180001
insert into user values(72,"yourname","12312312321","123123213213",313,0,"2021-11-19 05:56:50","2021-07-16 06:58:37","2020-07-15 02:37:32",1);
package main

import (
	"context"
	"fmt"
	"log"
	"math/rand"
	"sync"
	"time"

	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

var (
	DB   *sqlx.DB
	once sync.Once
)

func InitDB(config string) {
	// this Pings the database trying to connect
	// use sqlx.Open() for sql.Open() semantics
	once.Do(
		func() {
			ndb, err := sqlx.Connect("mysql", config)
			if err != nil {
				log.Fatalln(err)
				panic(err)
			}
			if err = ndb.Ping(); err != nil {
				log.Fatalln(err)
				panic(err)
			}
			DB = ndb
		})

}

func IncUserDeniedRecord(ctx context.Context, userName string, channel int) error {

	sqls := "select now()"
	var name1 string
	rows, err := DB.QueryContext(ctx, sqls)
	if err != nil {
		fmt.Println(err)
	}

	for rows.Next() {
		rows.Scan(&name1)
	}
	fmt.Println("db now():", name1)

	sqls = fmt.Sprintf("update %s set denied_count=denied_count+1, denied_time=NOW() where username=? and channel=? ", "user")
	_, err = DB.ExecContext(ctx, sqls, userName, channel)
	if err != nil {
		return fmt.Errorf("IncUserDeniedRecord error %v", err)
	}
	//commit := "commit"
	//DB.QueryContext(ctx, commit)

	sql := "select denied_count,denied_time from user where username=\"yourname\" and channel=1"
	var count int
	var testTime string
	rows, err = DB.QueryContext(ctx, sql)
	if err != nil {
		fmt.Println(err)
	}

	for rows.Next() {
		rows.Scan(&count, &testTime)
	}
	fmt.Println(count, "&", testTime)
	return nil
}

func main() {
	InitDB("root:password@tcp(10.0.0.1:3306)/testdb?parseTime=true&loc=Local")
	// fmt.Println(time.Now().UTC())
	for i := 1; i < 20; i++ {
		time.Sleep(time.Duration(rand.Intn(5) * int(time.Second)))
		//ClearUserDeniedRecord(context.TODO(), "yourname", 1)
		fmt.Println("当前系统时间:", time.Now().UTC())
		err := IncUserDeniedRecord(context.TODO(), "yourname", 1)
		fmt.Println(err)
	}
}

【看到的非预期行为】
denied_time 只修改了一次,后面就不再改变了
image

【期望看到的行为】
denied_time 实时更新

【相关组件及具体版本】
tidb v4.0.8
proxysql v2.0.6

【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

1、我看你的查询条件与更新条件不一样,看是否有出入
where username=“yourname” and channel=1"
2、另外,你可以把update与select执行的SQL字符串打印出来,对比下。

条件是一样的,update是用的传参方式,select是直接写的,参数都是一样的。另外,同样的代码,4.0.10执行没问题,4.0.14执行没问题。4.0.8就有问题了,而在4.0.8,如果不通过proxysql而是直连tidb,这种情况也没有问题的;或者在连接proxysql的情况下,在update后再执行一条commit,也不会有问题。会不会是4.0.8的长链接有问题呢?

我这个怎么没有加急按钮