C# 在嵌套方法中实现嵌套事务的方法
假设我有一个如下所示的类,我如何实现一些东西,使MasterMethodC# 在嵌套方法中实现嵌套事务的方法,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
(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
}