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 只修改了一次,后面就不再改变了
【期望看到的行为】
denied_time 实时更新
【相关组件及具体版本】
tidb v4.0.8
proxysql v2.0.6
【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。