Проблема с MySQL LAST_INSERT_ID () - PullRequest
1 голос
/ 17 марта 2011

У меня проблема с LAST_INSERT_ID().

Каждый раз, когда я его использую, мне нужно открывать и закрывать новое соединение.Это сильно замедляет мое приложение.Мне нужно сделать много операторов вставки и получить конец для каждого его вставленного идентификатора на том же соединении!Как я могу получить последний вставленный идентификатор в том же соединении для MySQl, ODBC и C # из определенной таблицы без проблем параллелизма?

вот мой код:

#region Private Variables
private static DataAccess _DataAccess = null;
private static object _SyncLock = new object();
private OdbcConnection myConnection = null;
#endregion

#region Instance Method
public static DataAccess Instance
{
    get
    {
        lock (_SyncLock)
        {
            if (_DataAccess == null)
                _DataAccess = new DataAccess();
            return _DataAccess;
        }
    }
}
#endregion

#region Constractors
public DataAccess()
{
    myConnection = new OdbcConnection(stringConnDB);
    myConnection.Open();
}
#endregion

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

Каждый раз, когда я использую его, мне нужно открыть и закрыть новое соединение

Нет, вам не нужно новое соединение. Вы должны использовать его на том же соединении сразу после оператора вставки.

Из руководства :

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

3 голосов
/ 17 марта 2011

Почему вы думаете, что вам нужно открыть новое соединение? На самом деле вы должны не открыть новое соединение, вы должны использовать last_insert_id() на том же соединении, чтобы быть уверенным, что получите правильный результат.

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

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