如何将许多 SQL 查询作为事务处理?
How do I do many SQL queries as transactions?
我一直在编写执行 DELETE、UPDATE 的代码, 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.
我一直在编写执行 DELETE、UPDATE 的代码, 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.