Coldfusion 8 многопоточный параллелизм - PullRequest
0 голосов
/ 26 марта 2012

У меня была проблема с Coldfusion 8, которую я недавно опубликовал в переполнении стека Coldfusion 8 выполнял и CFIf, и оператор CFElse что я думал, что сузился до проблемы 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> 

означает, что один и тот же пользователь выполняет 2 одновременных запроса. Если запросы слегка разнесены, Запрос A вставит пользователя в базу данных, но прежде чем Запрос A сможет CFLOGIN и CFLOCATION, Запрос B попадет в CFIF-уведомление о том, что в базе данных уже есть пользователь, и создаст CLIENT.ERROR_MESSAGE и CFLOCATION в New-Account.html. Однако, если запросы не распределены, происходит то, что код работает и отправляет пользователя на страницу checkout.cfm, однако в базу данных пользователь вставляется дважды.

Шаги, которые я предпринял, чтобы попытаться решить эту проблему:

1: Использование разных баз данных на одном и том же MYSQL-сервере (путем изменения источника данных на один из наших других сайтов, имеющих аналогичные / идентичные tbl_users). Те же результаты.

2: размещение веб-сайта на другом сервере Coldfusion 8 / Windows 2003 (но с использованием того же сервера MYSQL). Те же результаты.

3: положить

<cflock name="NewUser" timeout="30" type="EXCLUSIVE">

в начале кода и

</cflock>

в конце кода. Те же результаты.

Я действительно думал, что добавление CFLOCK в код решит проблему, но это не так, и теперь я понятия не имею, что делать дальше (но это может быть потому, что я никогда не использовал CFLOCK раньше , и я использую это неправильно). У кого-нибудь есть идеи, как исправить эту проблему, чтобы отправлялся только один запрос? Или есть идеи, почему отправляются 2 запроса? (Я не думаю, что это pebkac, потому что я тот, кто проводит тестирование, и я не нажимаю кнопку подтверждения дважды)

Кроме того, я использую веб-сервер Windows 2003 с Coldfusion 8. И отдельный сервер Windows 2003 с MYSQL 5.

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Вы создаете параллельное приложение. Будьте рады, что вы нашли эту проблему так рано в вашем цикле разработки Параллельные приложения работают лучше, когда они используют ограничения СУБД для управления своим параллелизмом, а не тот код, который вы показали в своем примере.

Я предлагаю вам переключиться на InnoDB, если вы его еще не используете, а затем настроить столбец tbl_users.var_username в качестве первичного ключа с уникальным ограничением в базе данных.

Тогда, не SELECT со своего стола. Просто сделай INSERT. Вы получите исключение из операции вставки <cfquery>, если имя пользователя уже существует. Обращайтесь с этим соответствующим образом. Если INSERT работает правильно, вы только что добавили нового пользователя, и все в порядке. Если это не удается, вы пытаетесь добавить дубликата пользователя и можете представить соответствующий ответ в веб-интерфейсе пользователя.

0 голосов
/ 28 марта 2012

Извините, мой рейтинг недостаточно высок, чтобы просто оставить комментарий под вашим вопросом ...

Мне интересно, почему вы получаете два или более одновременных запроса пользователя для этого раздела кода.Получаете ли вы доступ к другим файлам CFM с помощью функций AJAX или ColdFusion AJAX?

Я думаю, что ваше решение будет заключаться в том, чтобы отследить, почему один пользователь несколько раз нажал на эту часть кода.

Вы можетеиспользуйте , чтобы отследить, как называется этот раздел кода.

...