在事务中执行查询(摘录)
摘自微软技术丛书
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方法。