Mysql Coldfusion 8多线程并发

Mysql Coldfusion 8多线程并发,mysql,multithreading,concurrency,windows-server-2003,coldfusion-8,Mysql,Multithreading,Concurrency,Windows Server 2003,Coldfusion 8,不久前我在Stack Overflow上发布的Coldfusion 8有一个问题 我认为我已经缩小到mysql的问题,但经过进一步的调查,我已经缩小到多线程/每个会话多个请求的问题。这可能仍然是MYSQL的问题,但我不知道如何修复它 代码到底出了什么问题: <cfif isValid("email", form.email)> <cfquery name="check_user" datasource="#request.dsn#">

不久前我在Stack Overflow上发布的Coldfusion 8有一个问题 我认为我已经缩小到mysql的问题,但经过进一步的调查,我已经缩小到多线程/每个会话多个请求的问题。这可能仍然是MYSQL的问题,但我不知道如何修复它

代码到底出了什么问题:

    <cfif isValid("email", form.email)>     
    <cfquery name="check_user" datasource="#request.dsn#">
         SELECT var_username, var_password
         FROM tbl_users
         WHERE var_username = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.EMAIL#">
         AND var_password = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.PASSWORD#">
      </cfquery>
     <cfif check_user.recordcount EQ 0>
         <cfquery datasource="#request.dsn#" name="insertuser">
             INSERT INTO tbl_users (var_username, var_password)              VALUES
             (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.EMAIL#">,             <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.PASSWORD#">)
         </cfquery>
           <cflogin idletimeout="1800">
         <cfloginuser
                  name = "#FORM.email#"
                 password ="#FORM.password#"
                 roles = "0">
          </cflogin>
         <cflocation addtoken="No" url="#request.secure_url#checkout.cfm">
     <cfelse>
         <cfset client.error_message = "Your Email Address is already registered.">
         <cflocation addtoken="No" url="#request.site_url#New-Account.html">
     </cfif>
  <cfelse>
     <cfset client.error_message = "Your Email Address is not Valid.">
     <cflocation addtoken="No" url="#request.site_url#New-Account.html">
  </cfif> 
在代码的开头和

</cflock>
在代码的末尾。同样的结果

我真的认为在代码上加一个CFLOCK可以解决这个问题,但事实并非如此,现在我不知道下一步该怎么办,但这可能是因为我以前从未使用过CFLOCK,而且我用错了。是否有人知道如何解决此问题,以便只发送一个请求?或者知道为什么要发送两个请求吗?我不认为它是pebkac,因为我是做测试的人,而且我没有按两次提交按钮


另外,我使用的是Windows2003Web服务器,带有coldfusion 8。还有一个单独的windows 2003服务器和MYSQL 5。

很抱歉,我的排名不够高,无法在你的问题下方发表评论

我想知道为什么一个用户在这段代码中会收到两个或多个并发请求。您是否使用AJAX或ColdFusion AJAX函数访问其他CFM文件

我认为您的解决方案将是跟踪为什么一个用户会多次点击该部分代码


您可以使用跟踪如何调用这段代码。

您正在构建一个并发应用程序。很高兴您在开发周期的早期就发现了这个问题。当并发应用程序使用DBMS约束来管理其并发性时,而不是使用示例中所示的代码时,它们工作得最好

如果您还没有使用InnoDB,我建议您切换到InnoDB,然后将tbl_users.var_username列设置为主键,并在数据库中设置唯一约束


然后,不要从表中选择。只需插入。如果用户名已经存在,则插入操作将出现异常。妥善处理。如果插入工作正常,那么您只需添加一个新用户,一切正常。如果失败,您将尝试添加一个重复的用户,您可以在web用户界面上显示适当的响应。

我不使用coldfusion在此网站上提供的任何Ajax功能。我运行了cflog,正如我所说的,每个条目都有一个双条目,这是其中的一个示例,其中包含试图添加的电子邮件和密码-'信息,jrpp-632,03/28/12,10:32:50,,用户test@email.com密码信息,jrpp-630,03/28/12,10:32:50,用户test@email.com密码’很好地使用了cflog。我假设您有一个登录表单,用户只需完成一次,然后单击submit按钮即可登录。现在回想起来,我的一个项目也遇到了类似的问题。IE允许用户点击submit按钮,每次点击时都会调用表单操作。我的解决方案是放入一个小JavaScript片段,在单击按钮时禁用/隐藏按钮。这里会是这样吗?不会,因为我是进行测试并遇到问题的人,我不会多次点击提交按钮。但是,这是一个很好的实现方法,因为当我把代码放到现场时,我想知道您是否将cgi.HTTP_REFERER添加到cflog中,它是否会给出第二次提交的来源。我将cgi.HTTP_REFERER添加到日志文件中,它显示New-Account.html,这正是它应该来自的地方,对于日志中的两个条目,我正在使用InnoDB,并且我决定尝试您的方法,因此我在数据库中创建了var_username,并让代码进行插入,然而,它只是添加了另一个条目,无论是否已经有使用该用户名的用户。这可能是因为我已经为该表设置了另一个PK,这是一个唯一的自动增加ID。我不知道在一个表中有两个PK是否会导致这种情况,但它不起作用。无论如何,我没有在SQLyog中正确应用唯一键,现在我这样做了,它不再添加两个条目,现在使用这个解决方案似乎还有一大堆其他的问题。我宁愿不解决这个问题,而是找到并发的根本原因并解决它。不过,感谢您提供的独特/插入方法,我可能会在将来解决这些问题后使用这种方法
</cflock>