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()
事务肯定不能跨数据库服务器了……
PS:业务不一样,个人小建议,自己衡量,不满意勿BS,呵呵……
------解决方案--------------------
用com+事物
------解决方案--------------------
业务层中可以不用connection.
可以在dal中声明一个属性来包装DbTransaction,
然后bll中可以得到
http://topic.csdn.net/u/20091101/19/f21697d7-8f0c-4eb3-8e59-d0fe2f0b04b0.html