日期:2014-05-17  浏览次数:20417 次

问一个,关于DAL层的纠结问题。。请大家进来讨论。。。有理发言就有分啊。。速度来。。
A表是金额总数,B表是转账记录,
现在,B表新增一个转账记录,同时,A表要减去被减数。
所以,要用事务,两条SQL一起执行,

但是,关于DAL的情况是这样的
现在A类执A表的基本操用,
B类执行B表的基本操用,

如果用事务执行刚才两条语句,把 他们写在一起,不知道写在那类好,是A类,还是B类。。

------解决方案--------------------
引用:
Quote: 引用:

BLL层调用 A表的dal 和B表的dal
你在bll层开启事务,然后将sqlconnection 传给
A和B的DAL层 这样就可以了

这样的话,在会不会在BLL操作SQL语句了昵。。



using (TransactionScope scope = new TransactionScope())
{
   a_dal.Insert(model1);
   b_dal.Insert(model2);
   //...
   scope.Complete();
}

没有操作SQL语句.
------解决方案--------------------
引用:
A表是金额总数,B表是转账记录,
现在,B表新增一个转账记录,同时,A表要减去被减数。
所以,要用事务,两条SQL一起执行,

但是,关于DAL的情况是这样的
现在A类执A表的基本操用,
B类执行B表的基本操用,


既然你封装什么A表、B表,为什么不封装事务呢?

你可以写
using(var tran = CreateMyTransaction())
{
    转账(tran);
    记总账(tran);
}

也就是说,事务是参数。

如果你在业务设计时不考虑事务,你还提这个问题干什么?如果业务逻辑层不考虑事务,那么根本表达不了这个业务逻辑。由此可见,至少在你的需求描述中,那种“不考虑事务的所谓DAL”根本就是缺乏基本概念的东西。

至于说事务是什么东西的封装,根本不需要纠结。所谓TransactionScope,也不过是人家的一种封装,这种封装根本不能灵活通用地用于其它关系数据库。你完全可以封装你自己的 MyTransaction 类型,只要把关系数据库事务必须有的一两个属性和两三个方法封装到接口中就行了。