Mon système a 2 bases de données dans le même MySql. L'entreprise doit s'assurer que les données s'insèrent complètement dans 2 bases de données dans la même transaction. Voici mon échantillon:

public void test()
{
    int returnValue = 0;
    System.IO.StringWriter writer = new System.IO.StringWriter();
    try
    {
        using (TransactionScope scope = new TransactionScope())
        {
            returnValue = TestA(returnValue, writer);

            returnValue = TestB(returnValue, writer);

            scope.Complete();
        }
    }
    catch (Exception ex)
    {
    }
}

private static int TestB(int returnValue, System.IO.StringWriter writer)
{
    using (MySqlConnection connection2 = new MySqlConnection("server=localhost;database=test;user id=root;password=root;port=3307;characterset=utf8;connectiontimeout=72000;"))
    {
        connection2.Open();

        // Execute the second command in the second database.
        returnValue = 0;
        MySqlCommand command2 = new MySqlCommand("Insert tbb (`time`)value ('10:00:00')", connection2);
        returnValue = command2.ExecuteNonQuery();
        writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
    }
    return returnValue;
}

private static int TestA(int returnValue, System.IO.StringWriter writer)
{
    using (MySqlConnection connection1 = new MySqlConnection("server=localhost;database=test1;user id=root;password=root;port=3307;characterset=utf8;connectiontimeout=72000;"))
    {
        connection1.Open();

        // Create the SqlCommand object and execute the first command.
        MySqlCommand command1 = new MySqlCommand("Insert tb1 (`Name`, `Value`)value ('ai', '2017-04-26')", connection1);
        returnValue = command1.ExecuteNonQuery();
        writer.WriteLine("Rows to be affected by command1: {0}", returnValue);
    }

    return returnValue;
}

Quand je cours, j'ai une erreur:

Plusieurs connexions simultanées ou connexions avec différentes chaînes de connexion dans la même transaction ne sont actuellement pas prises en charge.

Pourquoi cela arrive-t-il?

S'il ne peut pas résoudre, veuillez me donner d'autres solutions.

-1
Ai Le 26 avril 2017 à 07:42

3 réponses

Meilleure réponse
private static int TestA(int returnValue, System.IO.StringWriter writer)
{
    .... USE SAME CONNECTION AS TESTA HERE

    // Create the SqlCommand object and execute the first command.
                                                      ****THIS*****
    MySqlCommand command1 = new MySqlCommand("Insert `test1`.`tb1` (`Name`, `Value`)value ('ai', '2017-04-26')", connection1);
                                                      ****THIS*****
    returnValue = command1.ExecuteNonQuery();
    writer.WriteLine("Rows to be affected by command1: {0}", returnValue);
}

return returnValue;

}

Donc, ce que je veux dire, c'est .... ne pas utiliser 2 connexions. utilisez 1 connexion et spécifiez le nom de la base de données avec la table

1
user5328504 26 avril 2017 à 04:57

Vous ne pouvez pas créer plusieurs objets MySqlConnection dans un même TransactionScope; si vous le faites, vous obtiendrez l'erreur que vous avez vue. Cela est suivi sous le nom de MySQL Bug 50773.

Vous souhaiterez peut-être passer à https://github.com/mysql-net/MySqlConnector ( une bibliothèque de connecteurs OSS MySQL compatible avec MySql.Data) qui prend en charge TransactionScope.

0
Bradley Grainger 28 janv. 2018 à 02:49

Fais-le comme ça:

 MySqlConnection conn = new MySqlConnection();
        private  int TestB(int returnValue, System.IO.StringWriter writer)
        {
            MySqlConnection conn = new MySqlConnection("server=localhost;database=test;user id=root;password=root;port=3307;characterset=utf8;connectiontimeout=72000;");

                conn.Open();

                // Execute the second command in the second database.
                returnValue = 0;
                MySqlCommand command2 = new MySqlCommand("Insert tbb (`time`)value ('10:00:00')", conn);
                returnValue = command2.ExecuteNonQuery();
                writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
                conn.Close();
               return returnValue;
        }

        private  int TestA(int returnValue, System.IO.StringWriter writer)
        {
            conn = new MySqlConnection("server=localhost;database=test1;user id=root;password=root;port=3307;characterset=utf8;connectiontimeout=72000;");

                conn.Open();

                // Create the SqlCommand object and execute the first command.
                MySqlCommand command1 = new MySqlCommand("Insert tb1 (`Name`, `Value`)value ('ai', '2017-04-26')", conn);
                returnValue = command1.ExecuteNonQuery();
                writer.WriteLine("Rows to be affected by command1: {0}", returnValue);

                conn.Close();

            return returnValue;
        }
0
Vijunav Vastivch 26 avril 2017 à 05:37