三层架构达人来指点指点 事务操作如何放在BLL层

gameboyerik001 2009-03-20 10:06:47
小弟想把对于数据的事务操作放在BLL层 不知道应该如何做

比如说 DAL层中 DAL.InsertA()是向A表插入一段数据 DAL.InsertB()是向B表插入一段数据

想在BLL层的 某个.cs中 使用事务操作 让DAL.InsertA()和 DAL.InsertB() 实现事务操作 如果都成功则 committrans

如果有一个失败则 Rollback




——————————————————————————————————————————

问了很多地方都是把事务操作放在DAL层中 或者 写在存储过程里

这样如果更换数据库的话则麻烦一些 比如sql-server更换 Access或者 更换 Oracle

请三层架构达人指点一下

...全文
536 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzfe 2010-09-06
  • 打赏
  • 举报
回复
还是有点不太明白.
jilezhenren 2009-12-01
  • 打赏
  • 举报
回复
学习一下
jcren183 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 uxspy 的回复:]
引用 9 楼 cnidb 的回复:
不过这样对现有的项目来讲,还是得修改DAL
DAL.InsertA(.....)就要增加一个InsertA(trans,.....)的重载方法

下午一位坛上的人说用iBatis.Net.是很方便解决这个问题,但只能在新项目中使用;


我在想应该要DbSerice增加一个事务唯一实例的方法,
DbAccess中发现事务存在,就将当前的操作加入到事务中,否则按原来的方式操作;

下午试了一下,可行,不过存在并发问题,明天再解决。。。。



不知道你解决了没有,通常,这是一个更优雅的办法,我也在为同步烦恼,您说的并发,是不是就是我指的同步问题,有人说把一个dbtransaction压入线程上下文,但我不明白这样能控制同步吗?难不成一次sql链接就是一个线程?如果这样的话,并发解决了,希望你能回复
[/Quote]

并发的问题试下类继承 : ContextBoundObject
uxspy 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vrhero 的回复:]
.NET提供了数据库无关的显式和隐式编程模型...去看看System.Transactions命名空间...

不要一提事务就认为是数据库事务,就必须和DAL打交道...
[/Quote]
你是不是想说那个scope,一般提这个问题,一定是直接或间接用到了类似MS的sqlhelper的访问层,在这种模式下,有2点要注意的东西
1.一般我会在一次执行完sql语句后,关闭connection
2.两个函数,一般会是2个connection,scope不是并发的,依旧是串行的,2个connection,会导致scope启动msdtc(分布式数据库服务),而我们一般其实只在访问一个数据库,这不是杀鸡用牛刀吗?况且,用transactionscope在访问一个数据库的时候,跟dbtransaction有啥区别?性能呢?又低很多,因此
【不适合此处的场景】
uxspy 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cnidb 的回复:]
不过这样对现有的项目来讲,还是得修改DAL
DAL.InsertA(.....)就要增加一个InsertA(trans,.....)的重载方法

下午一位坛上的人说用iBatis.Net.是很方便解决这个问题,但只能在新项目中使用;


我在想应该要DbSerice增加一个事务唯一实例的方法,
DbAccess中发现事务存在,就将当前的操作加入到事务中,否则按原来的方式操作;

下午试了一下,可行,不过存在并发问题,明天再解决。。。。

[/Quote]

不知道你解决了没有,通常,这是一个更优雅的办法,我也在为同步烦恼,您说的并发,是不是就是我指的同步问题,有人说把一个dbtransaction压入线程上下文,但我不明白这样能控制同步吗?难不成一次sql链接就是一个线程?如果这样的话,并发解决了,希望你能回复
a7373773 2009-07-20
  • 打赏
  • 举报
回复
B表 超级强悍
ssy888 2009-03-31
  • 打赏
  • 举报
回复
DAL.InsertA(参数1 ,2,3。。。)
vrhero 2009-03-31
  • 打赏
  • 举报
回复
.NET提供了数据库无关的显式和隐式编程模型...去看看System.Transactions命名空间...

不要一提事务就认为是数据库事务,就必须和DAL打交道...
gameboyerik001 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
如果定义BLL并随便切换DAL实现技术的时候,却要业务层代码依赖于DAL层实现技术,编写BLL代码如果依赖SqlTransaction或者OracleTransaction或者其它什么具体的IDBTransaction,这是缺少抽象设计能力的表现。

记得帖子《从菜鸟腾飞至专家(我的心得)》曾经引起了极大争议,实际上这是一个人从小程序员开始思考软件架构设计的起步过程,开始从需求而不是底层实现来设计了,才能解决菜鸟所认为根本不可能、根本不理解的设计。
[/Quote]


您简直太专业了 我确实是思考软件架构设计的flashman
liuyeede 2009-03-21
  • 打赏
  • 举报
回复
看你是非要把层次给搞乱,如果业务逻辑简单,就可以省掉BLL层了。
我是翔子 2009-03-21
  • 打赏
  • 举报
回复
让你得DAL.InsertA()和DAL.InsertB()返回给bll层调用得那个函数就行了么,然后在bll层做判断
strife013 2009-03-21
  • 打赏
  • 举报
回复
看看
scy251147 2009-03-21
  • 打赏
  • 举报
回复
学习下
cnidb 2009-03-21
  • 打赏
  • 举报
回复
不过这样对现有的项目来讲,还是得修改DAL
DAL.InsertA(.....)就要增加一个InsertA(trans,.....)的重载方法

下午一位坛上的人说用iBatis.Net.是很方便解决这个问题,但只能在新项目中使用;


我在想应该要DbSerice增加一个事务唯一实例的方法,
DbAccess中发现事务存在,就将当前的操作加入到事务中,否则按原来的方式操作;

下午试了一下,可行,不过存在并发问题,明天再解决。。。。
cnidb 2009-03-21
  • 打赏
  • 举报
回复
居然在这里找到答案了,还是sp1234回答的。哈哈。。。
  • 打赏
  • 举报
回复
如果定义BLL并随便切换DAL实现技术的时候,却要业务层代码依赖于DAL层实现技术,编写BLL代码如果依赖SqlTransaction或者OracleTransaction或者其它什么具体的IDBTransaction,这是缺少抽象设计能力的表现。

记得帖子《从菜鸟腾飞至专家(我的心得)》曾经引起了极大争议,实际上这是一个人从小程序员开始思考软件架构设计的起步过程,开始从需求而不是底层实现来设计了,才能解决菜鸟所认为根本不可能、根本不理解的设计。
  • 打赏
  • 举报
回复
你认为BLL层有没有事务概念呢?按照你的描述,它是有的,因为你说“想在BLL层的 某个.cs中 使用事务操作....”。但是我见过有人却硬说事务是数据库的东西,若不是BLL的东西。

如果你的数据层就是依赖于 System.Data 框架的,那么你可以直接使用 System.Data.IDbTransaction,具体来说你的这个BLL方法就写为类似:


//创建一个 IDbTransaction 具体实例对象。它的Connection 属性可以返回一个数据库连接;它的实现IDisposable的方法中应该可以自动调用Rollback方法。
using(IDbTransaction trans= DAL.CreateNewDbTransactionInstance())
{
DAL.InsertA(trans,.....);
DAL.InsertB(trans,.....);
trans.Commit();
}


而如果你的框架更加抽象,你可以自己模仿 IDbTransaction 而自己设计一个接口,使用方法是一样的,只要你的DAL可以承接并利用好这个接口的实例进行事务Commit和Rollback就可以。
sjt000 2009-03-20
  • 打赏
  • 举报
回复
常规的事务都是用和数据库的transaction
所以在BLL控制不到,写在DAL里就好了。
zzc205 2009-03-20
  • 打赏
  • 举报
回复
事务放在BLL也无可厚非,DAL与实务相关的方法接收一个事务参数,在BLL创建并传入这个参数就行了。
当然这样做在更换数据库时是需要改动BLL层的代码的,不过很少,例如把SqlTransaction改为OracleTransaction,查找替换就行了。

62,039

社区成员

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

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

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

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