我需要进行一个相对琐碎的事务,但是这应该会影响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块代价高昂,如果在执行过程中某个地方抛出了一个异常,那么其他代码仍然会被执行,更重要的是,transaction.Commit();也会被抛出。这使得事务毫无用处,因为当我想要一个事务(全部或不需要)时,我会得到部分更改的database。
由于我在这个问题上缺乏经验,我想知道怎样才能正确地处理这种情况。在其中一个示例中,有一个bool标志指示当前操作的执行情况,在调用transaction.Commit();之前,需要进行某种检查:
if (!hasErrors)
{
transaction.Commit();
}但是,由于我在事务中包含了服务器表,而且我有一个用于获取信息或检查某些内容的查询,所以使用标志的想法并不是很诱人。我正在考虑删除using()块,这样(至少我认为这是应该发生的),每当抛出错误时,我就直接转到主要的catch块。所以..。有一些想法,但实际的处理方法是什么呢?
发布于 2014-09-01 10:08:58
我已经修改了您的代码,包括了所有命令的公共事务。
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();
} https://stackoverflow.com/questions/25603089
复制相似问题