首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

C#三层中关于跨层调用事务解决思路

2013-10-21 
C#三层中关于跨层调用事务本帖最后由 soita 于 2012-06-11 22:50:23 编辑一般情况下如果要调用事务,会在DA

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

热点排行