有两张表,user和userInfo,用户在注册的时候向user表插入帐号密码,user表的userID是自增的,然后我想在此同时向userInfo插入一条相同userID的数据,在java的MyBatis里面可以在mapper中指定keyProperty属性,后来在golang中使用last_insert_id,返回的userID不对,如果在插入后,直接搜max(id)的话,感觉应该并发的时候有问题,难道解决方法只有存储过程了吗?有没有其他的在代码层的解决方案?
func (u TraUser) Add() (int, error) { now := time.Now() stmt, err := db.MysqlDB.Prepare("insert into tra_user(username,password,name,createDate) values(?,?,?,?)") if err != nil { log.Println(err) return 0, err } defer stmt.Close() u.UserName = u.UserName + strconv.FormatInt(now.Unix(), 10) _, err = stmt.Exec(u.UserName, u.Password, u.Name, now) if err != nil { return 0, err } var userID int row, err := db.MysqlDB.Query("SELECT LAST_INSERT_ID()") if err != nil { log.Println("err :", err) return 0, err } row.Scan(&userID) log.Println("userID :", err) return userID, err}
解决方案
同一个会话中通过"SELECT LAST_INSERT_ID();"是可以返回新插入数据的主键值;
程序中有没有使用连接池,导致在不同的会话中执行了?
其他方案:
程序中生成uuid触发器