用堆管理你的数据库事务

香水坏坏 发表于 2007-7-7 [ASP.NET]

原文地址:http://www.codeguru.com/csharp/csharp/cs_data/cachingandpeformance/article.php/c13437/

在许多WEB应用程序中,尽管对数据库操作大多数是用单次表查询或修改,有些部分你需要进行多次修改数据库。
这样的情况下,你应该考虑使用事物处理(transactions).事务定义了一系列需要被执行的工作,为了完成事务,
事务的每个部分都必须成功完成。如果都完成了,事务被提交到数据库。如果没有,所有的改变都将滚回(不修改)。
如果你要处理的任务非常复杂,你也可以选择镶套事务。

在我写的一部分代码中,我建立了一个方法用Stack(堆)集合来管理镶套的事务。堆是计算机科学里面一个基础概念,
实现后进先出结构。当你开始事务处理,把事物压到堆里。当你提交事务,它从堆里移出。如果你需要滚回事务,你必须
滚回每一个镶套事务。堆对于完成这项工作来说太完美了。

下面的函数是我添加到我数据库类的。

C#代码
  1. public void BeginTransaction()   
  2. {   
  3. SqlTransaction currentTrans = currentConnection.BeginTransaction();   
  4. transactions.Push(currentTrans);   
  5. }   
  6.   
  7. public void RollbackTransaction()   
  8. {   
  9. SqlTransaction currentTrans;   
  10. while (transactions.Count > 0)   
  11. {   
  12. currentTrans = (SqlTransaction)transactions.Pop();   
  13. currentTrans.Rollback();   
  14. }   
  15. }   
  16.   
  17. public void CommitTransaction()   
  18. {   
  19. SqlTransaction currentTrans = (SqlTransaction)transactions.Peek();   
  20. currentTrans.Commit();   
  21. transactions.Pop();   
  22. }   
  23.   
  24. public SqlTransaction CurrentTransaction   
  25. {   
  26. get  
  27. {   
  28. if (transactions.Count > 0)   
  29. return (SqlTransaction)transactions.Peek();   
  30. else  
  31. return null;   
  32. }   
  33. }   

我定义的事务变量:
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 联系他,提交你的问题或反馈。

545 0 标签: 事务 数据库 
访客评论
    发表评论
    • 你的姓名:
    • 你的网站:
    •   EMAIL:   
    • 评论内容:
    • 私人