本帖最后由 tfrtfr 于 2010-03-17 21:02:58 编辑

解决方案 »

  1.   

    在存储过程中
    Begin TRANSACTION 
    Commit TRANSACTION 
    ROLLBACK TRANSACTION 

    using (TransactionScope transScope = new TransactionScope()) 
    {}
    业务层中可以不用connection. 
    可以在dal中声明一个属性来包装DbTransaction, 
    然后bll中可以得到. 
    对于要用事务的方法传同一个DbTransaction即可
      

  2.   

    To wuyq11:
    首先谢谢你的回复.
    我知道代码怎么写,关键是我要知道我说的那种情况,应该由哪方来做这件事,主要是讨论一种写代码和存储过程的规范.
    因为如果存储过程里都是没写事务的,那就意味着程序中调的地方都要加上类似
    using (TransactionScope transScope = new TransactionScope()) 
    {}
    的语句,而我觉得应该存储过程应该管好自己内部的事务,程序要管好的是自己多次调用之间的事务.
      

  3.   

    个人倾向于第二种,确切地说就是如果可以使用数据库的事务功能实现可以不考虑使用ADO.NET提供的事务功能。使用ADO.NET提供的事务功能,主要应用于事务中的步骤次数不固定(比如每个订单有几条订单项不固定)。使用数据库的事务功能在这里可能有的缺点就是可能把复杂的业务逻辑包含在事务处理过程中
      

  4.   

    不能一概而论...数据库事务只是事务控制方法的一种,一定要清楚每种事务方法都是性能、可维护性及架构设计的综合因素决定的...数据库事务的优点是良好的性能,但可维护性较差...另外对DBMS特性依赖度过高,某些场景复杂度过高,如跨越多个可识别事务的管理器的分布式事务...一般来说,如果不是对性能有特别要求不应该由存储过程控制事务而应该由调用者控制事务...当然如果你不是面向对象的开发就无所谓了,全写在存储过程里也不是不可以...
      

  5.   

    To vrhero:
    我仅指过程对自己内部做的事的处理.譬如过程里有两个Update语句,执行第一个没有问题,当执行第二个的时候发生错误。这时候对一个update的回滚是应该存储过程做,还是返回一个错误,由调用者判断,然后回滚呢。
    我理解为一个方法应该自己做好自己的事情,自己内部已经出错了,不处理回滚,而依赖调用者,是不是有点不合理?
      

  6.   


    上面的第一种是指在存储过程中控制事务,第二种是指在ADO.NET中控制事务
      

  7.   

    众说纷纭啊。
    算了,程序里加上事务吧。
    不过我还是觉得不合理,本来存储过程自己可以做的事,现在所有调用的地方都得先开始事务-〉调用过程-〉结束事务,工作量明显增加。作为公用方法,调用的地方肯定不止一个。
    至少我看到SqlServer里的系统存储过程都会有事务去处理自己对库的改变的,不知道其他数据库是不是这样。
      

  8.   

    这个就是性能和重构之间的取舍关系了,从dba的角度来看数据库操作的性能是第一位的,从开发的角度来看程序的可重构性更重要,如果你是开发那就应该牺牲一点db的操作性能来提高程序的重构能力。
      

  9.   

    其实这类问题完全应该到SQL Server板块去问。(但不知道那里会不会回答清楚)T-SQL 语言使用 RaiseError 语句抛出异常给调用者,这样你的程序以及存储过程全都不用管什么Trans,因为SQL Server自动为每一个请求开启了一个事务,而RaiseError时就会自动回滚。你“现在的同事”返回了错误标志,既然使用这么原始的方式,那么就把工作推卸给其它人了。
      

  10.   

    google了一下,中文的关于RaiseError的文章还真是少的可怜。但是你去读任何一本关于T-SQL权威书籍,都应该重点讲到这个东西。搜了一篇文章作为参考:http://www.easewe.com/Article/Document/333.htm