3

假设我的项目就像.net petshop。它有一个 BLL、DAL 和 SQLHelper。

通常,我在 web 层调用 BLL 函数,BLL 函数调用 DAL 函数,最后,DAL 调用 sqlhelper。

但在某些情况下,我需要一笔交易。

例如:

网络层:

我需要调用一些 BLL 函数。代码如下:

var m = BLLFunction_1();

var n=  BLLFunction_2();

if (m+n<100)
{
// need rollback here
}
else
{
BLLFunction_3();
// commit here 
}

所以我不得不在web层使用一个事务对象,把它传入BLL函数,BLL层把它传给DAL层,最后传给SQLHelper。

这有点难看。

我想知道这种情况有什么优雅的方法。

4

2 回答 2

2

我假设您正在 ADO.NET 中寻找事务。

基本上,您需要将“操作”包装到 TransactionScope 中。

    try
    {
        using(TransactionScope ts = new TransactionScope())
        {
            //perform SQL
            using(SqlHelper sh = new SqlHelper())
            {
                //do stuff
            }

            //call new DAL function

            //call other DAL function

            ts.Complete();            
        }
    }
    catch(Exception ex)
    {
        throw ex;
    }
于 2013-08-08T12:55:32.817 回答
0

您好,在您的 BLL 函数中创建事务,需要 TransactionScopeOption

public void BLLFunction_1()
   {     
       using(TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
       {
           //do ur stuff here

           ts.Complete();
       }
   }

    public void BLLFunction_2()
   {     
       using(TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
       {
           //do ur stuff here

           ts.Complete();
       }
   }

需要 TransactionScopeOption :范围需要事务。如果环境事务已经存在,它会使用环境事务。否则,它会在进入范围之前创建一个新事务。这是默认值。所以在这里你的 BLLFunction_2 将使用 BLLFunction_1 的事务而不是创建新的。

于 2013-08-08T13:05:39.790 回答