0

У меня была проблема с Coldfusion 8, которую я опубликовал на Stack Overflow не так давно Coldfusion 8 doing both CFIf and the CFElse statement , что я думал, что я сузился до проблемы mysql, но с (большим) дальнейшим расследованием я сузил вплоть до многопоточных/множественных запросов на сеанс. (Это все еще может быть проблема MYSQL, но я понятия не имею, как это исправить)Coldfusion 8 Multi Thread Concurrency

Что на самом деле происходит не так с кодом:

<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 ' s в 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 Server с MYSQL 5.

ответ

0

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

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

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

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

+0

Я не использую какие-либо функции Ajax, которые имеют coldfusion на этом веб-сайте. Я запускал cflog, и, как я уже сказал, каждая запись имеет двойную запись, вот образец от нее, у нее есть электронная почта и пароль, которые необходимо добавить - «Информация», «jrpp-632», «03/28/12 »,« 10:32:50 »,« User [email protected] password »« Информация »,« jrpp-630 »,« 03/28/12 »,« 10:32:50 », «User [email protected] password» ' –

+0

Приятное использование cflog. Я предполагаю, что у вас есть форма входа в систему, которую пользователь завершает один раз, и нажимает кнопку отправки для входа. Теперь, когда я думаю об этом, у меня была аналогичная проблема с одним из моих проектов. Это было с IE. IE разрешил пользователю спам нажать кнопку «Отправить», и каждый раз, когда он был нажат, будет вызвано действие формы. Мое решение состояло в том, чтобы поместить небольшой фрагмент JavaScript, чтобы отключить/скрыть кнопку, когда она была нажата. Может ли это быть здесь? –

+0

Нет, потому что я человек, который проводит тестирование и испытывает проблемы, и я не нажимаю кнопку отправки несколько раз. (однако, это было бы хорошей идеей для реализации, когда я ставлю код в реальном времени) –

0

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

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

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

+0

Я использую InnoDB, и я решил попробовать свой метод, поэтому я сделал var_username PK в базе данных и сделал код INSERT, однако он просто добавляет еще одну запись, есть ли у пользователя с этим именем пользователя , (может быть, потому, что у меня уже есть еще одна PK для этой таблицы, ее уникальный идентификатор Auto Increase ID). Я не знаю, может ли это иметь 2 PK в таблице, но не работает. –

+0

Nevermind, не применил уникальный ключ в SQLyog должным образом, теперь, когда я это сделал, он больше не добавляет 2 записи, однако теперь, похоже, существует целый ряд проблем с использованием этого решения. Я бы предпочел не перевязать эту проблему, но найти основную причину параллелизма и решить эту проблему. (однако, благодарю вас за уникальный подход/Insert, я могу использовать это для будущего, как только я исправлю эти проблемы) –