繁体   English   中英

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

[英]How do I do many SQL queries as transactions?

我一直在做在学校的数据库中执行DELETEUPDATEINSERTSELECT的代码。 问题在于它只能同时执行一个查询。 像这样:

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操作的原子行为。 这意味着,如果一项操作失败,则数据库将回滚所做的任何更改,就好像没有发生任何操作一样。

请记住,它们按顺序运行, 而不是同时运行。 但是,由于它们是原子的,因此感觉类似于在单个操作中运行所有内容。

为了使用C#使用OleDbConnection类运行事务,您可以从连接对象创建事务(假定已打开)。 请记住,尽管与存储过程不同,您需要手动提交或回滚事务。

提交事务会使该组操作“永久”到数据库。 提交后无法回滚。

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

以下是从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的可以支持交易,但MyISAM

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM