关于三层架构中事务的处理

lvfeng19806001 2009-11-01 07:38:11
在三层架构中,BLL层一般会用到事务,那在业务层中就必须用到Connection对象,去创建事务,我的理解对吗?
大家平时都是怎么用的,能说说吗?
谢了!
...全文
2024 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
yun524816125 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 netbo 的回复:]
BLL层是什么层 三层架构 我只知道 MVC 啊!!!
[/Quote] 业务逻辑层
jdb861202 2010-01-15
  • 打赏
  • 举报
回复
那个SqlHelper.BeginTransaction(sqlconnection conn)
的方法内容是什么?
alex1987214 2009-11-07
  • 打赏
  • 举报
回复
原来可以回复啊?? 嘿嘿
alex1987214 2009-11-07
  • 打赏
  • 举报
回复
结贴还能回复不?
lvfeng19806001 2009-11-05
  • 打赏
  • 举报
回复
感谢大家的回复,结贴!
caobob 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 alex1987214 的回复:]
其实楼主这个问题 以前我翻过很多帖子 也在 网上找过
很郁闷 都没找到一个好的解决方案

问题可以缩成:如何在业务逻辑层里使用事务

事务的处理 放在数据库里实现 当然是最好的
但是在DAL层里使用事务的话 似乎让各个数据访问类直接的耦合性又增加了  数据访问层的作用应该只是
简单的 增 删 改 查 等基本操作
按设计的原则  事务放在业务逻辑层 处理应该是最好的 

希望大神们 给出一个好的解决方案 支持楼主继续把此贴顶下去
[/Quote]

其实很简单。真的很简单。DA只要增加一个函数就可以了。这个函数的功能就是在SQL中抛出异常(raiseerror)
hanyise520 2009-11-04
  • 打赏
  • 举报
回复
我觉得现在的 UI 层 更是 比业务层复杂了 ,各种得到 控件值在 封装成 对象 ,业务层就只接受这个对象而已 ,现在好纠结
alex1987214 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 lvfeng19806001 的回复:]
引用 47 楼 cc_net 的回复:
引用 44 楼 jaylongli 的回复:
C# code//test.cspublicbool Savexx(ZfJbXx zfjbxx,string cymj)
  {
   sql1="INSERT INTO tablename(Id,col1,col2) VALUES(@Id,@col1,@col2)   update tablename2 set col=@col";
   sql2="INSERT INTO tablename3(Id,col1,col2) VALUES(@Id,@col1,@col2)";//参数设置(略)using(SqlTransaction tran= SqlHelper.BeginTransaction(SqlHelper.DBConnectionString))
   {try
    {//SqlHelper.TransExecuteNonQuery(tran,CommandType.Text,sql1,parms);
     SqlHelper.ExecuteNonQuery(tran,CommandType.Text,sql1,parms);//执行多个不同的DAL     SqlHelper.ExecuteNonQuery(tran,CommandType.Text,sql2,parms);//执行多个不同的DAL
     tran.Commit();returntrue;
    }catch
    {
     tran.Rollback();returnfalse;
    }
   }

上面就可以实现你说的,封装下


不是太明白,这个代码是那一层的?BLL里面不是调用DAL,而在dal中调用SqlHelper.ExecuteNonQuery吗?

我也想看看BLL调用DAL中不同类中方法时使用事务的例子。

他这个只是举个例子而已,是个业务!就是在业务层的方法中,如下:
using(SqlTransaction tran= SqlHelper.BeginTransaction(SqlHelper.DBConnectionString))
    {try
    {


      //多个DAL层带事务的方法!


      tran.Commit();
      returntrue;
    }catch
    {
      tran.Rollback();returnfalse;
    }
}

[/Quote]
BLL层中还带 链接字符串 多不优雅啊!
greencq 2009-11-04
  • 打赏
  • 举报
回复
遇到同样问题,学习
ll6855668 2009-11-04
  • 打赏
  • 举报
回复
没看明白 不发表意见
muyg1987 2009-11-04
  • 打赏
  • 举报
回复
好麻烦
越看越迷糊
顶上去,在学习
yym115 2009-11-04
  • 打赏
  • 举报
回复
学习
加油馒头 2009-11-04
  • 打赏
  • 举报
回复
h
lvfeng19806001 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 alex1987214 的回复:]
其实楼主这个问题 以前我翻过很多帖子 也在 网上找过
很郁闷 都没找到一个好的解决方案

问题可以缩成:如何在业务逻辑层里使用事务

事务的处理 放在数据库里实现 当然是最好的
但是在DAL层里使用事务的话 似乎让各个数据访问类直接的耦合性又增加了  数据访问层的作用应该只是
简单的 增 删 改 查 等基本操作
按设计的原则  事务放在业务逻辑层 处理应该是最好的

希望大神们 给出一个好的解决方案 支持楼主继续把此贴顶下去
[/Quote]
确实有些迷茫!不过19楼lovehongyun和sp1234给了我很大启示!
不加事务的传连接字符串或连接对象,都是临时创建,然后释放!
加事务的可以在DBHelper中封装一个SqlTransaction属性,里面可以用一个静态的连接,反正只要保证在同一个事务中SqlTransation唯一就行!然后再BLL层直接调用这个SqlTransation即可!
不知道我说的对不?
MoFzAgel 2009-11-03
  • 打赏
  • 举报
回复
MS提供的有DAL实现类 希望看一下 里面有对事务的操作
DSIOF3KIDSKTR 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
BLL层调用DAL层方法,在数据操作层使用事务
SQL一般写在DAL层,通过数据库类实现调用。
在BLL通过接口调用DAL方法
Model,实现业务实体。
IDAL,实现接口。
SQLServerDAL,实现接口里的方法。
web.config里的配置信息,为SQLServerDAL的程序集。
DALFactory,返回程序集的指定类的实例。
BLL,调用DALFactory,得到程序集指定类的实例,完成数据操作方法。
WEB,调用BLL里的数据操作方法。
看看petshop
http://topic.csdn.net/u/20090912/17/e9b2dd15-f29b-495f-855c-187ff1807511.html?90127
[/Quote]
不要老拿PetShop说事,行不???
lvfeng19806001 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 cc_net 的回复:]
引用 44 楼 jaylongli 的回复:
C# code//test.cspublicbool Savexx(ZfJbXx zfjbxx,string cymj)
  {
  sql1="INSERT INTO tablename(Id,col1,col2) VALUES(@Id,@col1,@col2)  update tablename2 set col=@col";
  sql2="INSERT INTO tablename3(Id,col1,col2) VALUES(@Id,@col1,@col2)";//参数设置(略)using(SqlTransaction tran= SqlHelper.BeginTransaction(SqlHelper.DBConnectionString))
  {try
    {//SqlHelper.TransExecuteNonQuery(tran,CommandType.Text,sql1,parms);
    SqlHelper.ExecuteNonQuery(tran,CommandType.Text,sql1,parms);//执行多个不同的DAL    SqlHelper.ExecuteNonQuery(tran,CommandType.Text,sql2,parms);//执行多个不同的DAL
    tran.Commit();returntrue;
    }catch
    {
    tran.Rollback();returnfalse;
    }
  }

上面就可以实现你说的,封装下


不是太明白,这个代码是那一层的?BLL里面不是调用DAL,而在dal中调用SqlHelper.ExecuteNonQuery吗?

我也想看看BLL调用DAL中不同类中方法时使用事务的例子。
[/Quote]
他这个只是举个例子而已,是个业务!就是在业务层的方法中,如下:
using(SqlTransaction tran= SqlHelper.BeginTransaction(SqlHelper.DBConnectionString))
{try
{


//多个DAL层带事务的方法!


tran.Commit();
returntrue;
}catch
{
tran.Rollback();returnfalse;
}
}
alex1987214 2009-11-03
  • 打赏
  • 举报
回复
其实楼主这个问题 以前我翻过很多帖子 也在 网上找过
很郁闷 都没找到一个好的解决方案

问题可以缩成:如何在业务逻辑层里使用事务

事务的处理 放在数据库里实现 当然是最好的
但是在DAL层里使用事务的话 似乎让各个数据访问类直接的耦合性又增加了 数据访问层的作用应该只是
简单的 增 删 改 查 等基本操作
按设计的原则 事务放在业务逻辑层 处理应该是最好的

希望大神们 给出一个好的解决方案 支持楼主继续把此贴顶下去
cc_net 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 jaylongli 的回复:]
C# code//test.cspublicbool Savexx(ZfJbXx zfjbxx,string cymj)
{
sql1="INSERT INTO tablename(Id,col1,col2) VALUES(@Id,@col1,@col2) update tablename2 set col=@col";
sql2="INSERT INTO tablename3(Id,col1,col2) VALUES(@Id,@col1,@col2)";//参数设置(略)using(SqlTransaction tran= SqlHelper.BeginTransaction(SqlHelper.DBConnectionString))
{try
{//SqlHelper.TransExecuteNonQuery(tran,CommandType.Text,sql1,parms);
SqlHelper.ExecuteNonQuery(tran,CommandType.Text,sql1,parms);//执行多个不同的DAL SqlHelper.ExecuteNonQuery(tran,CommandType.Text,sql2,parms);//执行多个不同的DAL
tran.Commit();returntrue;
}catch
{
tran.Rollback();returnfalse;
}
}

上面就可以实现你说的,封装下
[/Quote]

不是太明白,这个代码是那一层的?BLL里面不是调用DAL,而在dal中调用SqlHelper.ExecuteNonQuery吗?

我也想看看BLL调用DAL中不同类中方法时使用事务的例子。
lawbc 2009-11-03
  • 打赏
  • 举报
回复
看看nh就知道了
在bll BeginTransaction(),这个事物为一个请求内共享(bs)或者一个线程内共享(cs),然后多个dal就可以使用了
加载更多回复(41)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧