簡體   English   中英

我的數據庫事務是否正確?

[英]Is my database transaction correct?

我的代碼很慢,運行這個metod需要至少10秒。 我有一個arrayList,其中包含我需要經歷的成分。 對於這些成分中的每一個,我需要更改數據庫中的數量。 所有項目都在rawmaterials表中。 我的代碼在交易方面是否正確? 我應該在哪里提交? 在我的代碼中,當我更新一個cookie的成分時,我將鎖定整個表

public void ProducePallet(string prodName, DateTime date)
{
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = conn;
    cmd.CommandText =
        "INSERT INTO pallets(prodName,prodDate,blocked,orderID) VALUES(@name,@date, false, null)";
    cmd.Prepare();
    cmd.Parameters.AddWithValue("@name", prodName);
    cmd.Parameters.AddWithValue("@date", date);
    cmd.ExecuteNonQuery();

    cmd = new MySqlCommand();
    cmd.Connection = conn;
    cmd.CommandText =
        "Select mName, quantity from recipes natural join ingredients where prodName=@pName";
    cmd.Prepare();
    cmd.Parameters.AddWithValue("@pName", prodName);
    cmd.ExecuteNonQuery();

    ArrayList ingredients = new ArrayList();
    string[] ingredientsPair;
    MySqlDataReader rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        ingredientsPair = new string[2];
        ingredientsPair[0] = rdr.GetString(0); //Ingredient name
        ingredientsPair[1] = rdr.GetString(1); //Quantity
        ingredients.Add(ingredientsPair);

    }
    rdr.Close();
    MySqlTransaction tr = conn.BeginTransaction();
    foreach (string[] i in ingredients)
    {

        cmd = new MySqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = "Select quantityLeft from rawmaterials where mName=@mName for update";
        cmd.Prepare();
        cmd.Parameters.AddWithValue("@mName", i[0]);
        rdr = cmd.ExecuteReader();
        int mQuantity = 0;
        while (rdr.Read())
        {
            mQuantity = rdr.GetInt32(0);
        }
        rdr.Close();
        mQuantity -= Int32.Parse(i[1]) * 36 * 10 * 15 / 100;
        //cmd = new MySqlCommand();
        //cmd.Connection = conn;
        cmd.CommandText = "Update rawmaterials Set quantityLeft = @newQL where mName=@mName";
        cmd.Prepare();
        cmd.Parameters.AddWithValue("@newQL", mQuantity);
        // cmd.Parameters.AddWithValue("@mName", i[0]);
        cmd.ExecuteNonQuery();


    }

    try
    {

        tr.Commit();
    }
    catch (Exception e)
    {
        try
        {
            tr.Rollback();
        }
        catch (Exception e2)
        {
            Debug.WriteLine(e2.ToString());
        }
        return;
    }
}

原料表

 mName           quantityLeft
Bread crumbs    8959500
Butter  7782300
Chocolate   8946000
Chopped almonds 8623350
Cinnamon    8986500
Egg whites  8886600
Eggs    8867700
Fine-ground nuts    8757000
Flour   7774200
Ground, roasted nuts    8797500
Icing sugar 8780760
Marzipan    8716500
Potato starch   8990550
Roasted, chopped nuts   8829900
Sodium bicarbonate  8998920
Sugar   8446500
Vanilla 8999460
Vanilla sugar   8996220
Wheat flour 8990550

添加“SET AUTOCOMMIT = 0”; 和“開始交易”; 在開始交易之前。

希望這會幫助你。

暫無
暫無

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

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