Нужно ли использовать объекты транзакций с MySQL? - PullRequest
1 голос
/ 11 декабря 2011

Мне нужно создать таблицу MySQL и заполнить ее некоторыми данными в Mono. Для этого я использую следующий код:

public class TestModel
{
    protected IDbConnection dbcon;

    public TestModel()
    {
        string connectionString = "Server=localhost;"
                                + "Database=cikdata;"
                                + "User ID=root;"
                                + "Password=password;"
                                + "Pooling=false";
        dbcon = new MySqlConnection(connectionString);
        dbcon.Open();

        IDbCommand dbcmd = dbcon.CreateCommand();

        // Create table
        dbcmd.CommandText = "CREATE TABLE employee (firstname varchar(32), lastname varchar(32))";
        dbcmd.ExecuteScalar();

        // fill this table with some data

        dbcmd.CommandText = "SELECT firstname, lastname FROM employee";
        IDataReader reader = dbcmd.ExecuteReader();
        while(reader.Read()) {
            string FirstName = (string) reader["firstname"];
            string LastName = (string) reader["lastname"];
            Console.WriteLine("Name: " + FirstName + " " + LastName);
        }

        // clean up
        reader.Close();
        reader = null;

        dbcmd.Dispose();
        dbcmd = null;
    }

    ~TestModel()
    {
        dbcon.Close();
        dbcon = null;
    }
}

Я видел много примеров того, как работать с MySQL в Mono, где используется IDbTransaction. Приведенный выше код работает без каких-либо объектов транзакции. Мне действительно нужно использовать объект транзакции (и IDbTransaction.Commit) в моем коде?

Извините, что задали такой вопрос новичку. Я в основном разработчик C ++ / PHP и у меня очень мало опыта работы с C # и Mono.

Ответы [ 2 ]

3 голосов
/ 11 декабря 2011

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

Причина в этом случае заключается в том, что CREATE TABLE вызывает неявную фиксацию в MySQL, поэтому после вашей первой команды (CREATE TABLE) вы уже зафиксировали транзакцию, а остальные команды произойдут все равно вне транзакций. И откат или коммит ничего не сделают.

Вот как это выглядит, если вы попытаетесь откатить CREATE TABLE

mysql [localhost] {msandbox} (test) > start transaction;
Query OK, 0 rows affected (0.01 sec)

mysql [localhost] {msandbox} (test) > create table transtest(id int);
Query OK, 0 rows affected (0.32 sec)

mysql [localhost] {msandbox} (test) > rollback;
Query OK, 0 rows affected (0.02 sec)

mysql [localhost] {msandbox} (test) > select * from transtest;
Empty set (0.00 sec)

Обратите внимание, что стол все еще там ...

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

Транзакция - это хорошая привычка, когда вы выполняете одну операцию в виде набора отдельных команд sql.

В этом случае это будет зависеть от того, хотите ли вы откатить таблицу создания, если код заполнения не удался.

Так что вы можете посмотреть на это как на следующие шаги.

Start a transaction
Create the table
Insert some data
Commit transaction

Если у вас нет явной транзакции, то есть неявная, поэтому, если вы добавили несколько операторов вставки к оператору create table и назвали ExcuteScalar, вы получите тот же эффект.

По существу используйте стартовую транзакцию / фиксацию транзакции, когда вы не хотите ничего менять, если какая-либо ее часть дает сбой.

Или, если вы не хотите, чтобы кто-либо другой пользователь изменял что-либо во время выполнения «пакета» операций.

...