假设我的项目与.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。
这有点难看。
我想知道这种情况的优雅方式是什么。
答案 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的事务而不是创建新的。