mysql - 如何避免(处理)插入操作的死锁?

标签 mysql go mariadb

在我的小型 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/

相关文章:

mysql - UTF-8字符有问题;我看到的不是我存储的

MySQL 获取当年季度 (QTD) 1,2,3,4

mysql - 仅显示具有两种类型记录的客户并且仅显示这些记录

javascript - 将 NodeJs MySQL 结果转换为可访问的 JSON 对象

go - 如何在 Go 中获取包含数据结构的结构的大小?

go - 循环内的互斥导致意外输出

java - 空关系表

php - 已弃用:mysql_connect()

MYSQL INSERT 基于 3 列的值

json - 在 Go 中将 float64 编码到 json