繁体   English   中英

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

[英]How to use transaction through multiple layer code in C#

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

那有点难看。

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

我假设您正在寻找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;
    }

嗨,在您的BLL函数中创建Transaction,并使用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的Transaction而不是创建new。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM