dongsi1944 2018-02-02 10:54
浏览 188

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

In my small web service, I get a deadlock when trying to insert a new row in logs table - Error 1213: Deadlock found when trying to get lock; try restarting transaction.

When I execute method Test many times, I get error. How can I avoid deadlock?

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
} 

Schema (from Comment):

CREATE TABLE IF NOT EXISTS logs (
    date_time datetime NOT NULL, 
    msg varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  • 写回答

1条回答 默认 最新

  • douleng3463 2018-02-13 02:31
    关注

    You have no PRIMARY KEY; that is naughty.

    Add

    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id)
    

    to the table definition. (See ALTER TABLE.)

    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名