Оператор вставки SQL выполняется дважды - PullRequest
1 голос
/ 03 декабря 2011

Что является лучшим способом предотвращения двойного щелчка пользователем или обновления страницы, которое может привести к выполнению оператора SQL-вставки дважды, я пытался отключить кнопку после щелчка, но результат не очень хороший. Я ожидаю, что это можно сделать из-за кода. что-то более похожее на коммит и откат SQL

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

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

Вы должны быть в состоянии идентифицировать этого пользователя среди множества, которые потенциально посещают ваш сайт.Проще всего это сделать с помощью SessionState, но если у вас больше нет необходимости в SessionState и вы хотите масштабировать ваше приложение, простой случайный файл cookie для идентификации пользователя можно использовать в качестве префикса для любых ключей, которые вы используете для помещения элементов вкеш сервера.

Допустим, вы использовали SessionState.Вы бы сделали что-то вроде следующего (псевдо):

public void StartAction()
{
  var inProgress = HttpContext.Current.Session["actionInProgress"] as bool;
  if (!inProgress)
  {
     try
     {
        HttpContext.Current.Session["actionInProgress"] = true;
        MySqlController.DoWork();
     }
     finally
     {
        HttpContext.Current.Session["actionInProgress"] = false;
     }
  }
}

Выше не учитывается следующее:

  • Перехват исключений и / или закрытие любых соединений в вашем finally block
  • Очередь последующих действий в результате следующих кликов на вашем клиенте (этот псевдокод просто возвращается, если действие уже выполняется)
  • Я пошел засамое простое решение, но на самом деле лучшей практикой было бы включить его в качестве службы, которая работает асинхронно, чтобы вы могли отслеживать прогресс как в интересах пользователя, так и для предотвращения множественных параллельных процессов.
1 голос
/ 03 декабря 2011

Возможно PRG Википедия статья может помочь вам:

Post / Redirect / Get (PRG) - это общий шаблон проектирования для веб-разработчиков. чтобы избежать определенных повторных представлений формы и позволить агентам пользователя вести себя более интуитивно с закладками и кнопкой обновления.

...