SQL в последний раз вставляет в Drupal. Это действительно ориентировано на многопотоковое исполнение?

Стреляя от бедра (ковбой, кодирующий ;-)), я предложил бы что-то вроде этого:

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return new HttpNotFoundResult("This doesn't exist");
    }
}
<час>

HttpNotFoundResult:

using System;
using System.Net;
using System.Web;
using System.Web.Mvc;

namespace YourNamespaceHere
{
    /// <summary>An implementation of <see cref="ActionResult" /> that throws an <see cref="HttpException" />.</summary>
    public class HttpNotFoundResult : ActionResult
    {
        /// <summary>Initializes a new instance of <see cref="HttpNotFoundResult" /> with the specified <paramref name="message"/>.</summary>
        /// <param name="message"></param>
        public HttpNotFoundResult(String message)
        {
            this.Message = message;
        }

        /// <summary>Initializes a new instance of <see cref="HttpNotFoundResult" /> with an empty message.</summary>
        public HttpNotFoundResult()
            : this(String.Empty) { }

        /// <summary>Gets or sets the message that will be passed to the thrown <see cref="HttpException" />.</summary>
        public String Message { get; set; }

        /// <summary>Overrides the base <see cref="ActionResult.ExecuteResult" /> functionality to throw an <see cref="HttpException" />.</summary>
        public override void ExecuteResult(ControllerContext context)
        {
            throw new HttpException((Int32)HttpStatusCode.NotFound, this.Message);
        }
    }
}
// By Erik van Brakel, with edits from Daniel Schaffer :)

Используя этот подход Вы соответствуете стандартам платформы. Там уже существует HttpUnauthorizedResult, таким образом, это просто расширило бы платформу в глазах другого разработчика, поддерживающего Ваш код позже (Вы знаете, психо, кто знает, где Вы живете).

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

<час>

я действительно использовал отражатель для взгляда на HttpUnauthorizedResult сейчас. Кажется, что они устанавливают StatusCode на ответе на 0x191 (401). Хотя это работает на 401, с помощью 404 как новое значение я, кажется, получаю просто пустую страницу в Firefox. Internet Explorer показывает значение по умолчанию 404 хотя (не версия ASP.NET). Используя панель инструментов веб-разработчика я осмотрел заголовки в FF, которые показывают 404 Не Найденный ответ. Могло быть просто что-то, в чем я неправильно сконфигурировал И следующие

<час>

Это сказанное, я думаю, что подход Jeff является прекрасным примером KISS. Если Вам действительно не нужно многословие в этом образце, его метод хорошо работает также.

8
задан coderama 11 September 2009 в 10:51
поделиться

1 ответ

Используя MySQL (как вы, кажется, указываете тегами в вашем вопросе) , функция db_last_insert_id () определяется следующим образом:

function db_last_insert_id($table, $field) {
  return db_result(db_query('SELECT LAST_INSERT_ID()'));
}

в database.mysql-common.inc


И LAST_INSERT_ID () зависит от соединения (цитата, выделено мной) :

ID, который был сгенерирован является хранится на сервере на на основе подключения. Это значит, что значение, возвращаемое функцией для данный клиент - первый Значение AUTO_INCREMENT создано для самое последнее заявление, касающееся Столбец AUTO_INCREMENT этим клиентом. На это значение не могут повлиять другие клиентов, даже если они создают AUTO_INCREMENT собственные значения. Такое поведение гарантирует, что каждый клиент может получить собственный идентификатор без забота о деятельности других клиентов , и без необходимости блокировки или транзакции.

Итак, я бы сказал, что это вполне нормально для MySQL; -)


Опубликованное вами определение на самом деле используется для PostGreSQL:

function db_last_insert_id($table, $field) {
  return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
}

В database.pgsql.inc


Из руководства pgsql по последовательностям (цитата; выделено мной) :

currval

Возвращает последнее значение полученный nextval для этой последовательности в текущем сеансе . (Ошибка сообщается, если nextval никогда не был призвал к этой последовательности в этом сеанс.) Обратите внимание, что, поскольку это возвращает локальное значение сеанса, это дает предсказуемый ответ: или другие сеансы не выполнялись nextval, поскольку текущая сессия сделала .

Так что, я думаю, это тоже нормально для PostGreSQL.

19
ответ дан 5 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: