2011-12-10 38 views
1

我需要创建一个MySQL表并在Mono中填充一些数据。我使用下面的代码可以这样做:我是否需要在MySQL中使用Transaction对象

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在单在使用IDbTransaction工作的例子很多。上面的代码没有任何事务对象。我真的需要在我的代码中使用交易对象(和IDbTransaction.Commit)吗?

对不起,问这样一个新手问题。我主要是一名C++/PHP开发人员,而且我对C#和Mono很少有经验。

+1

终结不好等 –

+0

裹IDisposable的对象“使用”块,正如已经说过的,终结者在这里是一个糟糕的主意。 – skolima

+0

谢谢@skolima。我已经意识到它为什么如此糟糕。另外,当'TestModel'对象还没有被删除时,我是否需要维护与数据库的持久连接?对于特定的数据库查询/事务,“打开”和“关闭”连接可能更好? – ezpresso

回答

1

当您将一个操作作为一组独立的sql命令运行时,交易是一种很好的习惯。

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

所以你可以看看它作为以下步骤。

Start a transaction 
Create the table 
Insert some data 
Commit transaction 

如果您还没有一个明确的交易,然后有一个imlicit之一,所以如果你附加一些插入语句来创建表的声明,并呼吁ExcuteScalar,你会得到同样的效果。

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

或者,如果您希望任何其他用户在“批量”操作正在执行时不更改任何内容。

+1

理论上你是对的。但是,在MySQL中,CREATE TABLE永远不会在事务中,因此如果您执行回滚,该表仍将被创建。我认为对于ExecuteScalar也是如此,因为在同一个事务中没有任何东西可以包含CREATE TABLE和其他东西。 –

+0

我想知道这件事,但更关心解释交易,而不是深入细节,远离嵌套。 –

+1

而MySQL没有嵌套事务:) –

3

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

在这种情况的原因是,CREATE TABLE导致在MySQL的implicit commit所以你的第一个命令(CREATE TABLE)后,你将已经COMMITED您的交易和命令的其余部分将反正外面发生的交易。回滚或提交将不会执行任何操作。

这是它的外观,如果你尝试回滚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) 

注意表如何仍然存在......

+0

所以我只需要在表中插入一些数据时使用事务对象,对吧?这样,如果出现问题,我将能够回滚事务中的操作。 – ezpresso

+0

如果您为一个“全部或全部”单元一起进行两个或多个插入/更新/删除操作,然后将其放入事务中。 –

相关问题