mysql中的同一行(nginx + tornado + mysqldb)

时间:2014-12-05 10:08:39

标签: python mysql tornado

我使用龙卷风为我的网络应用程序。 mysqldb用于将数据插入mysql5.1。 在生产环境中,有一个nginx +上游有10个龙卷风进程。 当网络很慢时,用户将双击该按钮并将相同的json数据发布到龙卷风处理程序,有时会在mysql中生成两行具有相同数据的行。实际上,我hava使用mysqldb transcation并测试逻辑。它在开发环境中是可以的(一个龙卷风过程)。

我的代码:

    import MySQLdb
    hostname = options.mysql_host
    uid = options.mysql_user
    database = options.mysql_database
    pwd = options.mysql_password
    port = 3306
    newid=-1
    conn = MySQLdb.connect(host=hostname, user=uid,db=database,passwd=pwd,port=int(port),use_unicode=True,charset="utf8")
    cursor = conn.cursor()

    try:

       sql_query = "select ID from ATable where USER_ID = "+str(_user_id)+" and START_DATE_LOCAL = '"+str(_start_date_local)+"' and FLAG = 1"
       cursor.execute(sql_query)
       results_query = cursor.fetchone()

       if results_query is not None:
          newid =int(results_query[0])
       else:
          #do insert
          sql="insert into ATable..."
          print sql

          cursor.execute(sql)
          newid = int(conn.insert_id())

       conn.commit()

    except Exception,e:
       print 'ERROR:',e
       conn.rollback()

    conn.close()
    return newid

我认为我的代码是正确的。 nginx或mysql5.1可能有问题吗?

我应该在nginx upstrem中为此处理程序配置ip_hash吗?

1 个答案:

答案 0 :(得分:0)

你有竞争条件。在生产中更容易看到,因为您通过更高延迟的网络发布,因此在第一次INSERT完成之前,您有更多时间单击按钮两次。典型的解决方案是在发布到服务器之前使用Javascript 使按钮自行禁用,以防止双击。有关在等待AJAX​​请求完成时禁用按钮的示例,请参阅this answer