添加事件处理程序
为了支持悲观锁定,只需少得令人吃惊的代码。在本例中,所有工作都在两个按钮(cmdFill和cmdUpdate)的事件处理程序中完成。首先添加以下cmdFill事件处理程序:
Dim txn As SqlTransaction
Private Sub cmdFill_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdFill.Click
SqlConnection1.Open()
txn = SqlConnection1.BeginTransaction(IsolationLevel.RepeatableRead)
SqlDataAdapter1.SelectCommand.Transaction = txn
SqlDataAdapter1.Fill(DsCustomers1)
End Sub
txn事务处理变量必须在任何过程的外部定义,最好在窗体类的一级上定义。提交更新时,需要再次用到它,所以在cmdFill_Click过程终止时,它不应超出作用域。
在cmdFill_Click过程内,调用SqlConnection对象的BeginTransaction方法来创建一个Transaction对象。注意要使用BeginTransaction的一个特殊重载版本,它能接受一个IsolationLevel参数,这样才能指定RepeatableRead。然后,将SelectCommand的Transaction属性设为刚才创建的Transaction对象,并调用Fill方法来填充DsCustomers1 DataSet。
Fill方法将运行你构建DataAdapter时指定的SelectCommand查询,并会在服务器上启动事务处理。由于已将事务处理隔离级别设为RepeatableRead,所以会锁定查询返回的所有记录,其他任何应用程序都不能更新你检索的数据。
下一步是创建更新代码,它提交事务处理,并移除记录锁。以下代码是Update按钮的Click事件处理程序:
Private Sub cmdUpdate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdUpdate.Click
SqlDataAdapter1.InsertCommand.Transaction = txn
SqlDataAdapter1.UpdateCommand.Transaction = txn
SqlDataAdapter1.DeleteCommand.Transaction = txn
SqlDataAdapter1.Update(DsCustomers1)
txn.Commit()
SqlConnection1.Close()
End Sub
这里要获取cmdFill_Click中创建的Transaction对象,也就是txn,并把它指派给DataAdapter的InsertCommand、UpdateCommand以及DeleteCommand属性。这样一来,对数据进行的任何更改都会在检索记录时启动的同一个事务处理中回放。如果不发送这些值,cmdUpdate_Click中执行的更新将无法完成,因为记录会被锁定。
将更新设为原始事务处理的一部分后,只需调用DataAdapter的Update方法,并让更新实际地发生。最后,调用事务处理的Commit方法来释放锁。
