用堆管理你的数据库事务
原文地址:http://www.codeguru.com/csharp/csharp/cs_data/cachingandpeformance/article.php/c13437/
在许多WEB应用程序中,尽管对数据库操作大多数是用单次表查询或修改,有些部分你需要进行多次修改数据库。
这样的情况下,你应该考虑使用事物处理(transactions).事务定义了一系列需要被执行的工作,为了完成事务,
事务的每个部分都必须成功完成。如果都完成了,事务被提交到数据库。如果没有,所有的改变都将滚回(不修改)。
如果你要处理的任务非常复杂,你也可以选择镶套事务。
在我写的一部分代码中,我建立了一个方法用Stack(堆)集合来管理镶套的事务。堆是计算机科学里面一个基础概念,
实现后进先出结构。当你开始事务处理,把事物压到堆里。当你提交事务,它从堆里移出。如果你需要滚回事务,你必须
滚回每一个镶套事务。堆对于完成这项工作来说太完美了。
下面的函数是我添加到我数据库类的。
- public void BeginTransaction()
- {
- SqlTransaction currentTrans = currentConnection.BeginTransaction();
- transactions.Push(currentTrans);
- }
- public void RollbackTransaction()
- {
- SqlTransaction currentTrans;
- while (transactions.Count > 0)
- {
- currentTrans = (SqlTransaction)transactions.Pop();
- currentTrans.Rollback();
- }
- }
- public void CommitTransaction()
- {
- SqlTransaction currentTrans = (SqlTransaction)transactions.Peek();
- currentTrans.Commit();
- transactions.Pop();
- }
- public SqlTransaction CurrentTransaction
- {
- get
- {
- if (transactions.Count > 0)
- return (SqlTransaction)transactions.Peek();
- else
- return null;
- }
- }
我定义的事务变量:
private Stack transactions = new Stack();
每次我运行Database类一个函数,查看CurrentTransaction是否为空;如果不为空,我设置每个SqlCommand对象的Transaction
属性为CurrentTransaction.当所有工作完成后,我调用CommitTransaction,用来提交当前事务到数据库。如果发生任何错误,
我能调用RollbackTransaction,滚回所有挂起的事务。在这样的模型中,事务任何一部分的失败意味着整个事没有完成。
关于Stack对象的使用,Peek方法返回堆顶部对象但不用堆中删除;这样做目的是让你使用对象但不从堆中删除,因为一个事务
在他完成前可能有3个或4个行为。
关于作者:
Eric Smith是印第安那一家提供web空间的Northstar Computer Systems公司的经理。从2001年就开始用.net开发。
写过12本关于.net,asp,Visual Basic的书。通过发EMAIL questions@techniquescentral.com 联系他,提交你的问题或反馈。
- 你的姓名:
- 你的网站:
- EMAIL:
- 评论内容:
- 私人

