在事务中执行查询(摘录)

摘自微软技术丛书

ADO.NET 2.0技术内幕

清华大学出版社

(美)David Sceppa 著

贾洪峰 译

第100页

 

SqlCommand类拥有一个Transaction属性,必须对其进行设置以在SqlTransaction中执行SqlCommand。在上一章,已经了解了如何使用SqlConnection类的BeginTransaction方法创建SqlTransaction对象。

如果开始了SqlConnection的一个SqlTransaction的一个SqlTransaction,必须将所有查询与该事务相关联。否则,将会接收到一个InvalidOperationException,同时带有一条消息指出:“当分配给该事务的连接处于挂起的本地事务中时,ExecuteNonQuery要求该命令拥有一个事务,该命令的Transaction属性未被初始化。”(上次就有遇到这个错误,现在知道怎么解决了。)

有两种方式可以将SqlCommand与SqlTransaction关联在一起。可以将SqlCommand的Transaction属性设置为SqlTransaction,也可以将SqlTransaction传递给SqlCommand的构造函数。以下代码使用第二种方法。在执行查询并确定该查询影响多少行之后,该代码调用SqlTransaction的RollBack方法,以防止数据库提交这些更改。

SqlConnection cn = new SqlConnection(strConn);

cn.Open();

using (SqlTransaction txn = cn.BeginTransaction())
{
    SqlCommand cmd = new SqlCommand(strSQL, cn, txn);
}

 

提示:为了确保没有使事务开放太长时间,请考虑在Using代码块中使用SqlTransaction对象,如以上代码段所示。事务保持开放的时间越长,数据库需要为该事务维护锁的时间也就越长,多位用户尝试锁定相同行的机会也就越大。如果在Using代码块的末尾没有提交或回滚SqlTransaction,则会隐式调用RollBack方法。

posted @ 2009-12-01 21:29  济阳补丁  阅读(897)  评论(0编辑  收藏  举报