Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在嵌套方法中实现嵌套事务的方法_C#_Mysql_Methods_Transactions_Nested - Fatal编程技术网

C# 在嵌套方法中实现嵌套事务的方法

C# 在嵌套方法中实现嵌套事务的方法,c#,mysql,methods,transactions,nested,C#,Mysql,Methods,Transactions,Nested,假设我有一个如下所示的类,我如何实现一些东西,使MasterMethod(MethodA、MethodB和MethodC)中所有被调用的方法继承从MasterMethod实例化的MySqlTransaction对象 private MySqlConnection OpenConnection() { try { MySqlConnection DbConn = new MySqlConnection("~connectionstring"); DbConn

假设我有一个如下所示的类,我如何实现一些东西,使MasterMethod
(MethodA、MethodB和MethodC)中所有被调用的方法继承从
MasterMethod
实例化的
MySqlTransaction
对象

private MySqlConnection OpenConnection() {
    try {
        MySqlConnection DbConn = new MySqlConnection("~connectionstring");
        DbConn.Open();

        return DbConn;
    } catch(Exception Ex) {
        throw Ex;
    }
}

public void MasterMethod() {
    using(MySqlConnection DbConn = OpenConnection()) {
        using(MySqlTransaction DbTrans = DbConn.BeginTransaction()) {
            try {
                MethodA();
                MethodB(Param1);
                MethodC(Param1, Param2);

                DbTrans.Commit();
            } catch(Exception Ex) {
                DbTrans.Rollback();
                throw Ex;
            }
        }
    }
}

public void MethodA() {
    using(MySqlConnection DbConn = OpenConnection()) {
        using(MySqlTransaction DbTrans = DbConn.BeginTransaction()) {
            try {
                // Lots and Lots of things to do

                DbTrans.Commit();
            } catch(Exception Ex) {
                DbTrans.Rollback();
                throw Ex;
            }
        }
    }
}

public void MethodB(int Param1) {
    using(MySqlConnection DbConn = OpenConnection()) {
        using(MySqlTransaction DbTrans = DbConn.BeginTransaction()) {
            try {
                // Lots and Lots of things to do

                DbTrans.Commit();
            } catch(Exception Ex) {
                DbTrans.Rollback();
                throw Ex;
            }
        }
    }
}

public void MethodC(string Param1, string Param2) {
    using(MySqlConnection DbConn = OpenConnection()) {
        using(MySqlTransaction DbTrans = DbConn.BeginTransaction()) {
            try {
                // Lots and Lots of things to do

                DbTrans.Commit();
            } catch(Exception Ex) {
                DbTrans.Rollback();
                throw Ex;
            }
        }
    }
}
在我当前的体系结构中,查询是在特定方法的块到达其末尾后立即提交的,而不是等待MasterMethod的try块最底部的
DbTrans.Commit()


如何使其
(MySqlTransaction对象)
在提交(或回滚)数据库更改之前,必须等待所有3个嵌套/调用的方法
(MethodA、MethodB、MethodC)

您必须使用2个不同的连接对象来维护状态(根据您的要求)。我已经发布了一个通用的数据库连接代码,你可以用自己的方式使用它

public class ConnectionClass
{
    public string ConnectionString = ConfigurationManager.ConnectionStrings["xyz"].ConnectionString;
    public SqlConnection conTrans = new SqlConnection();
    public SqlTransaction dbTrans;
    public SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["xyz"].ConnectionString);
    public SqlTransaction sqlTrans;



    public bool BeginConTrans()
    {
        try
        {
            conTrans.ConnectionString = ConnectionString;
            conTrans.Open();
            dbTrans = conTrans.BeginTransaction();
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }


    public bool CommitConTrans()
    {
        try
        {
            dbTrans.Commit();
            conTrans.Close();
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }


    public bool RollbackConTrans()
    {
        try
        {
            dbTrans.Rollback();
            conTrans.Close();
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }


    public bool ExecuteNonQueryTrans(string proc, SqlParameter[] par)
    {
        SqlCommand cmd = new SqlCommand();
        try
        {
            if (par != null)
            {

                for (int i = 0; i <= par.Length - 1; i++)
                {
                    cmd.Parameters.Add(par[i]);
                }
            }
            cmd.Connection = conTrans;
            cmd.Transaction = dbTrans;
            cmd.CommandText = proc;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

我不知道是我还是你的密码有点。。。你知道的。。。凌乱的我想这是我的错,我忘了我正在使用一个整洁的ORMFramework@TheQuestioner现在检查我的答案。是的,由于一些空格,格式不好:)这可能会派上用场。我会把这个作为参考。问题是我在MySQL服务器下运行,并使用Dapper ORM:)
public void MasterMethod()
    {
        try
        {
            BeginConTrans();
            // your methods A,B,C
            //must use ExecuteNonQueryTrans for your get/put data

        }
        catch (Exception ex)
        {
            //if any method fails handle exception and rollback the transcation
            RollbackConTrans();
        }
        CommitConTrans(); // if success ,commit the transcation

    }