У меня была проблема с 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.
Я не использую какие-либо функции 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» ' –
Приятное использование cflog. Я предполагаю, что у вас есть форма входа в систему, которую пользователь завершает один раз, и нажимает кнопку отправки для входа. Теперь, когда я думаю об этом, у меня была аналогичная проблема с одним из моих проектов. Это было с IE. IE разрешил пользователю спам нажать кнопку «Отправить», и каждый раз, когда он был нажат, будет вызвано действие формы. Мое решение состояло в том, чтобы поместить небольшой фрагмент JavaScript, чтобы отключить/скрыть кнопку, когда она была нажата. Может ли это быть здесь? –
Нет, потому что я человек, который проводит тестирование и испытывает проблемы, и я не нажимаю кнопку отправки несколько раз. (однако, это было бы хорошей идеей для реализации, когда я ставлю код в реальном времени) –