51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> asp.net >> 文章正文

C#三层中关于跨层调用事务

更新时间:2013-6-1:  来源:51代码网

C#三层中关于跨层调用事务

一般情况下如果要调用事务,会在DAL中创建Connection的时候启用事务,并将事务挂到Command中。然后根据情况来Commit或者Rollback。
以上没什么问题。

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

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

大概的结构:

C# code?public class ClassA {     ClassB b = new ClassB();     public void Test()     {         b.IntoX();         b.IntoY();           //如果IntoY的操作发生错误         if(false)         {             //回滚IntoX和IntoY的操作         }     } }


C# code?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()

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

赞助商链接
推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |