如何在C#中通过多层代码使用事务

时间:2013-08-08 12:42:23

标签: c# sql database transactions

假设我的项目与.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。

这有点难看。

我想知道这种情况的优雅方式是什么。

2 个答案:

答案 0 :(得分:1)

我假设您正在寻找ADO.NET中的Transaction。

基本上,您需要将“操作”包装到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;
    }

答案 1 :(得分: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的事务而不是创建新的。