我需要做一个相对简单的事务,但是应该影响5-6个表,所以我通过几个关于如何执行此操作的教程,因为我之前从未使用过事务,并且我已经忙着包装每个新查询在using(...)
块中,像这样:
SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
connection = new SqlConnection(localConnString);
connection.Open();
string insertSomeValues = "some SQL INSERT query"..
using (SqlCommand command = new SqlCommand(insertSomeValues, connection))
{
..
}
using(SqlCommand newCommand = new SqlCommand(otherQuery, connection))
{
..
}
transaction.Commit();
}
catch
{
transaction.Rollback();
}
finally
{
connection.Close();
}
所以我希望你明白了。我认为这个实现存在的问题是,由于using
块在某个地方被抛出异常,因此try-catch
块处于pricatice transaction.Commit();
块,其他代码仍然会被执行,更重要的是database
也是。这使得交易无用,因为当我想要一个交易(全部或全部)时,我最终会部分更改bool
。
由于我对这个主题缺乏经验,我想知道正确处理这种情况的方法是什么。在其中一个示例中,有一个transaction.Commit();
标志,指示当前操作如何进行,并在调用if (!hasErrors)
{
transaction.Commit();
}
之前进行某种检查:
using()
但是由于我在我的事务中包含了几个表,并且我有一些用于获取信息或检查某些内容的查询,因此使用标志的想法并不是很诱人。我正在考虑删除{{1}}块,以便(至少我认为应该发生的事情)每当抛出错误时我直接进入主catch块。那么..有一些想法,但处理这个问题的实际方法是什么?
答案 0 :(得分:0)
我修改了你的代码,通过包含所有命令的公共事务。
SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
connection = new SqlConnection(localConnString);
connection.Open();
transaction=connection.BeginTransaction();
string insertSomeValues = "some SQL INSERT query"..
using (SqlCommand command = new SqlCommand(insertSomeValues, connection,transaction))
{
..
}
using(SqlCommand newCommand = new SqlCommand(otherQuery, connection,transaction))
{
..
}
transaction.Commit();
}
catch
{
transaction.Rollback();
}
finally
{
connection.Close();
}