如何将许多 SQL 查询作为事务处理?

How do I do many SQL queries as transactions?

我一直在编写执行 DELETEUPDATE 的代码, INSERT, SELECT 在学校的数据库中。问题是它只能同时进行一个查询。像这样:

OleDbConnection con = DAL.GetConnection();
con.Open();

if (con.State == ConnectionState.Open) //si la conexion esta abierta...
{
    string sql = string.Format(" INSERT INTO lol (...)");
    //----->I shortened this above because it's not important <-----
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;
    int num = cmd.ExecuteNonQuery();
    con.Close();

    if (num == 0)
    {
         Response.Redirect("register.aspx?err=Error");
    }
    else
    {
         Session["id"] = MyDB.GetUserId(uname);
         Response.Redirect("home.aspx");
    }
}

有一次我的老师告诉我有一些东西,它是这样工作的:你做所有的 SQL 查询,或者没有人。 我想知道如何对此,它真的很有帮助。

谢谢!

你的老师指的是交易。大多数关系数据库都支持事务,包括 MySQL*。事务允许多个 CRUD 操作的原子行为。这意味着如果一个操作失败,数据库将回滚所做的任何更改,就好像 none 操作曾经发生过一样。

请记住,它们运行按顺序不是同时。但是,由于它们是原子的,因此感觉起来与它相似 运行在一次操作中完成所有操作。

为了 运行 使用 OleDbConnection class 使用 C# 的事务,您可以从您的连接对象创建一个事务,假设它是打开的。请记住,与存储过程不同,您需要手动提交或回滚事务。

提交事务会使该组操作'permanent' 进入数据库。提交后无法回滚

回滚是指将数据库重置为开始事务之前的状态。

下面是从 OleDbConnection 对象创建事务并执行提交的示例,以及您可能想要回滚的两种情况:

using(OleDbConnection con = DAL.GetConnection())
{
    OleDbTransaction transaction = null;
    try
    {
        con.Open();
        transaction = con.BeginTransaction()

        string queryString1 = //SQL string
        OleDbCommand cmd1 = new OleDbCommand();
        {
            Connection = con,
            CommandType = CommandType.Text,
            CommandText = queryString1
        };

        string queryString2 = //SQL string
        OleDbCommand cmd2 = new OleDbCommand();
        {
            Connection = con,
            CommandType = CommandType.Text,
            CommandText = queryString2
        };

        int num1 = cmd.ExecuteNonQuery();
        int num2 = cmd.ExecuteNonQuery();

        if (num1 == 0 || num2 == 0)
        {
            //We didn't expect something to return 0, lets roll back
            transaction.Rollback();
            //send error message
            Response.Redirect("register.aspx?err=Error");
        }
        else
        {
             //everything seems good, lets commit the transaction!
             transaction.Commit();
             Session["id"] = MyDB.GetUserId(uname);
             Response.Redirect("home.aspx");
        }
    }
    catch(OleDbException ex)
    {
         try
         {
             //something bad happened, lets roll everything back
             transaction.Rollback();
             Response.Redirect("register.aspx?err=Error");
         }
         catch
         {
             //we don't really care about this catch statement
         }
    }
}

这是关于 OleDbConnection.BeginTransaction 方法的 MSDN 文章,其中包含一个与我上面发布的内容类似的通用示例。

编辑
*正如@Clockwork-Muse 在评论中指出的那样 MySQL 支持交易的能力取决于所使用的底层引擎。有许多 MySQL 引擎,但最主要的两个是 InnoDB 和 MyISAM。 InnoDB CAN 支持事务,但 MyISAM NOT.