在我的小型 Web 服务中,尝试在日志表中插入新行时出现死锁 - 错误 1213:尝试获取锁时发现死锁;尝试重新启动事务。
当我多次执行方法测试时,出现错误。如何避免死锁?
func main() {
var err error
db, err = sql.Open("mysql", dbUser+":"+dbPassword+"@tcp("+dbAddr+")/"+dbDatabase)
if err != nil {
panic(err.Error())
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err.Error())
}
defer db.Close()
router := mux.NewRouter()
router.HandleFunc("/test/", Test).Methods("POST")
log.Error(http.ListenAndServe(":8080", router))
}
func Test(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Write(body)
_ = insertLog("Test")
}
func insertLog(msg string) error {
var sqlString string
sqlString = "insert into logs (date_time, msg) values(now(),?)"
stmt, err := db.Prepare(sqlString)
if err != nil {
log.Error(err)
return err
}
defer stmt.Close()
_, err = stmt.Exec(msg)
if err != nil {
log.Error("Msg: %s, Func: %s", err, function)
return err
}
defer stmt.Close()
return err
}
架构(来自评论):
CREATE TABLE IF NOT EXISTS logs (
date_time datetime NOT NULL,
msg varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
最佳答案
您没有PRIMARY KEY
;那是调皮的。
添加
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
到表定义。 (参见 ALTER TABLE
。)
关于mysql - 如何避免(处理)插入操作的死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48581136/