2011-12-10 39 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

如果您爲一個「全部或全部」單元一起進行兩個或多個插入/更新/刪除操作,然後將其放入事務中。 –

相關問題