我使用go将新用户插入mysql数据库。在插入用户之前,我保存了某种&#34; log-message&#34;在<p>{{observable | async}}</p>
表中。两个表格(msg
和msg
)都有user
。为了接收通过自动增量选择的id,我使用mysql&#39; s auto-increment
函数。这应该是线程安全的,正如许多关于堆栈溢出的其他讨论所指出的那样,因为它绑定到单个连接。
我问自己LAST_INSERT_ID()
之后stmt.Close()
是否会以任何方式改变mysql的行为(特别是线程安全性)?
stmt.Exec()
答案 0 :(得分:1)
关闭语句,正如您所做的那样,不会关闭数据库连接。数据库连接对LAST_INSERT_ID
来说非常重要。除非您致电db.Close()
,这将关闭基础连接,否则您的连接仍会保持打开状态。
但是,db
是连接的池,因此无论您何时关闭连接,都无法保证您在后续查询中获得相同的连接,除非您使用交易。
总而言之,你应该这样做(当然是添加错误处理)
tx, _ := db.Begin()
stmt, _ := tx.Prepare("INSERT INTO msg (message) VALUES(?)")
stmt.Exec(msg)
stmt.Close()
stmt, _ = tx.Prepare("SELECT LAST_INSERT_ID()")
stmt.QueryRow().Scan(&msgid)
stmt.Close()
_ = tx.Commit()
但请注意,更好的方法是使用Result.LastInsertId:
stmt, _ := tx.Prepare("INSERT INTO msg (message) VALUES(?)")
res, _ := stmt.Exec(msg)
stmt.Close()
msgid := res.LastInsertId()