Проблема параллелизма с MySql Last_Insert_Id () ... (C #) - PullRequest
0 голосов
/ 02 сентября 2010

Я не совсем уверен, почему следующее консольное приложение не дает ожидаемого поведения для last_insert_id (). Я читал, что last_insert_id () возвращает последнее значение auto_incremented для конкретного соединения, но в этом коде одинаковый результат возвращается для обоих соединений. Может кто-нибудь объяснить, где я ошибся?

    static void Main(string[] args)
    {
        string ConnectionString = "server=XXXX;database=XXXX;username=XXXX;password=XXXX;pooling=true;max pool size=100;min pool size=0";

        MySqlConnection conn1 = new MySqlConnection(ConnectionString);
        MySqlConnection conn2 = new MySqlConnection(ConnectionString);

        MySqlCommand command1 = new MySqlCommand();
        MySqlCommand command2 = new MySqlCommand();

        command1.Connection = conn1;
        command2.Connection = conn1;

        StringBuilder createTableCommandText = new StringBuilder();
        createTableCommandText.Append("Create Table TestTable (");
        createTableCommandText.Append("Id INT NOT NULL AUTO_INCREMENT, ");
        createTableCommandText.Append("str VARCHAR(20) NOT NULL, ");
        createTableCommandText.Append("PRIMARY KEY (Id));");

        StringBuilder insertCommandText = new StringBuilder();
        insertCommandText.Append("INSERT INTO TestTable (str) VALUES ('what is the dilleo?');");

        StringBuilder getLastInsertId = new StringBuilder();
        getLastInsertId.Append("SELECT LAST_INSERT_ID();");

        conn1.Open();
        conn2.Open();

        command1.CommandText = createTableCommandText.ToString();
        command1.ExecuteNonQuery();

        command1.CommandText = insertCommandText.ToString();
        command2.CommandText = insertCommandText.ToString();

        command1.ExecuteNonQuery();
        command2.ExecuteNonQuery();

        command1.CommandText = getLastInsertId.ToString();
        Console.WriteLine("Command 1:  {0}", command1.ExecuteScalar().ToString());
        command2.CommandText = getLastInsertId.ToString();
        Console.WriteLine("Command 2:  {0}", command2.ExecuteScalar().ToString());

        conn1.Close();
        conn2.Close();

        Console.ReadLine();
    }

Я знаю, что этого не происходит из-за объединения в строку подключения вверху, поскольку я попытался запустить программу без этой части строки, и у меня все еще были одинаковые результаты (т. Е. Что и команда 1, и команда 2 отображал то же значение для last_insert_id ()). Любые идеи приветствуются!

Большое спасибо,

Andrew

1 Ответ

2 голосов
/ 02 сентября 2010

Смотрите здесь:

command1.Connection = conn1;
command2.Connection = conn1;

Вы используете одно и то же соединение для обеих команд.

...