У меня была проблема с 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.