簡體   English   中英

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

[英]Do I need to use Transaction objects with MySQL

我需要創建一個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;
    }
}

我已經看到很多如何在使用IDbTransaction Mono中使用MySQL的示例。 上面的代碼在沒有任何事務對象的情況下工作。 我真的需要在我的代碼中使用事務對象(和IDbTransaction.Commit )嗎?

很抱歉問這樣一個新手問題。 我主要是一個C ++ / PHP開發人員,我對C#和Mono的經驗很少。

您絕對不應該將該代碼包含在事務中。 如果你這樣做,你只會混淆自己或其他讀者的代碼。

在這種情況下,原因是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)

請注意表格仍然存在...

當您以一組單獨的sql命令運行一個操作時,事務是一個好習慣。

在這種情況下,它取決於您是否希望在填充代碼失敗時回滾create table。

因此,您可以按以下步驟查看它。

Start a transaction
Create the table
Insert some data
Commit transaction

如果你沒有顯式事務,那么就有一個顯式事務,所以如果你將一些insert語句附加到create table語句並調用ExcuteScalar,你會得到相同的效果。

當你想要什么都不改變時,如果它的任何部分失敗,基本上使用啟動事務/提交事務。

或者,如果您在執行“批量”操作時不希望任何其他用戶更改任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM