我是否需要在MySQL中使用Transaction对象

时间:2011-12-10 22:45:21

标签: c# mysql transactions mono

我需要创建一个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;
    }
}

我已经看过许多如何在Mono中使用MySQL的示例,其中使用了IDbTransaction。上面的代码在没有任何事务对象的情况下工作。我真的需要在我的代码中使用事务对象(和IDbTransaction.Commit)吗?

很抱歉问这样一个新手问题。我主要是一个C ++ / PHP开发人员,我对C#和Mono的经验很少。

2 个答案:

答案 0 :(得分:3)

您绝对不应该将该代码包含在事务中。如果你这样做,你只会混淆自己或其他读者的代码。

在这种情况下的原因是CREATE TABLE在MySQL中导致implicit commit所以在你的第一个命令(CREATE TABLE)之后你已经提交了你的事务,其余的命令将会无论如何都发生在交易之外并且rollback或commit将不会执行任何操作。

如果您尝试回滚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 :(得分:1)

当您以一组单独的sql命令运行一个操作时,事务是一个好习惯。

在这种情况下,它取决于您是否希望在填充代码失败时回滚create table。

所以你可以按照以下步骤来看待它。

Start a transaction
Create the table
Insert some data
Commit transaction

如果你没有显式事务,那么就会有一个显式事务,所以如果你将一些insert语句附加到create table语句并调用ExcuteScalar,你就会得到相同的效果。

当你想要什么都不改变时,如果它的任何部分失败,基本上使用启动事务/提交事务。

或者,如果您希望在批量购买时不被任何其他用户更改。正在进行操作。