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

C#三层中关于跨层调用事务
本帖最后由 soita 于 2012-06-11 22:50:23 编辑
一般情况下如果要调用事务,会在DAL中创建Connection的时候启用事务,并将事务挂到Command中。然后根据情况来Commit或者Rollback。
以上没什么问题。

现在的情况是在BLL中会调用某一个或者多个DAL中的方法,每个方法都会单独开启一个连接,并执行SQL语句。
至于为什么要单独开启一个连接,原因很简单:因为使用到的数据库不同。
例如:BLL中ClassA类调用DAL中ClassB类的IntoX方法和IntoY方法。而IntoX方法会使用DataA数据库,IntoY方法会调用DataB数据库。两个数据库的连接字符串当然会不一样,甚至有时候会是一个MSSql一个Oracle。

总不能用DataA的事务来回滚DataB的操作吧?
那么如何能在IntoY方法发生错误时,连IntoX中的操作一起回滚掉?

大概的结构:

public class ClassA
{
    ClassB b = new ClassB();
    public void Test()
    {
        b.IntoX();
        b.IntoY();

        //如果IntoY的操作发生错误
        if(false)
        {
            //回滚IntoX和IntoY的操作
        }
    }
}



public class ClassB
{
    public void IntoX()
    {
        //操作DataA数据库
    }

    public void IntoY()
    {
        //操作DataB数据库
    }
}

------解决方案--------------------
这个还是可以实现的。

把DATAA的回滚,和DATAB的回滚各自拿出来,放在DAL层
然后从BLL层把CLASSB的这2个回滚放到一个BLL方法中去,并在BLL中生成新的回滚,其实就是个代理;
最后在BLL层判断操作是否成功,一个不成功,2个一起回滚
------解决方案--------------------
这个  需要自己写 代码 回滚,
1.假如说 执行到 第2个 数据库的 操作 出错,需要把 第一个对数据库的 操作 回滚过去,
2.假如第一个对数据库的操作 就出错,直接用Rollback直接回滚,因为这时对第2个数据的操作还没开始。

好像没有太直接的 方法处理

------解决方案--------------------
单独在dal层实现几个方法,每个数据库访问 都单独一个事务,
try
……
catch
{
t1.rollback();
t2.rollback();
...
}

或者

BLL层
try
{
f1();
f2();
}
这样可以保证f1出错,不会执行f2,,,,但是前提是f2()出错,不影响f1()

事务肯定不能跨数据库服务器了……

PS:业务不一样,个人小建议,自己衡量,不满意勿BS,呵呵……
------解决方案--------------------
用com+事物
------解决方案--------------------
业务层中可以不用connection.
可以在dal中声明一个属性来包装DbTransaction,
然后bll中可以得到
http://topic.csdn.net/u/20091101/19/f21697d7-8f0c-4eb3-8e59-d0fe2f0b04b0.html