Statement.Close是否会影响golang中mysql的线程安全LAST_INSERT_ID?

时间:2017-04-23 09:28:55

标签: mysql go

我使用go将新用户插入mysql数据库。在插入用户之前,我保存了某种&#34; log-message&#34;在<p>{{observable | async}}</p> 表中。两个表格(msgmsg)都有user。为了接收通过自动增量选择的id,我使用mysql&#39; s auto-increment函数。这应该是线程安全的,正如许多关于堆栈溢出的其他讨论所指出的那样,因为它绑定到单个连接。

我问自己LAST_INSERT_ID()之后stmt.Close()是否会以任何方式改变mysql的行为(特别是线程安全性)?

stmt.Exec()

1 个答案:

答案 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()