文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» 微软SQL Server专区 » SQL Server数据库管理 » 数据库事务控制的实现位置:服务器VS客户端,请大家讨论       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: 数据库事务控制的实现位置:服务器VS客户端,请大家讨论  ( 查看:316  回复:2 )   
  本主题由 阿楚 于 2007-8-24 07:48 加入本版推荐  
 
yyccd
技术员  点击可查看详细



帖子 116
精华 0
无忧币 643
积分 366
阅读权限 30
注册日期 2007-5-29
最后登录 2007-12-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-8-24 00:13   标题:数据库事务控制的实现位置:服务器VS客户端,请大家讨论
上一帖 |
这段时间开始有幸学习了ado.net访问数据库的一些内容。我开始思考一个有关数据库事务控制的问题。ado.net中的SqlTransaction 类可以为数据库访问提供事务的支持。你可以打开一个数据库联接,然后在这个联接上启动一个事务(启动事务相当于T-SQL的begin transaction语句),在这个启动了事务的数据库联接上你可以添加并执行若干数据库访问命令,然后根据命令的执行情况决定提交或者回滚事务。这使得通过ado.net访问数据库的应用程序可以实现数据库的事务控制。

另一方面,T-SQL同样提供了数据库的事务控制,这是众所周知的。通常,数据库设计人员常说,把数据的访问控制放在离数据最近的地方才是最安全的,比如我们设计数据库时,在数据表上实现的唯一约束、check约束、触发器等等都是基于这种设计思想的。类似ado.net这种的数据库访问技术也提供了对数据库事务的支持,但是按照“把数据的访问控制放在离数据最近的地方才是最安全的”的思想,我们有更好的选择方式。比如,我们可以设计数据库存储过程,由存储过程提供事务控制,并只允许数据库客户端访问数据库时去执行存储过程。这样一来,似乎就没有使用ado.net、ado、oledb等等这些数据库访问技术提供的支持事务的API接口的必要了。但是,我想未必是这样的,既然有这些API接口存在,肯定是有它的必要性的。

我现在想让大家讨论一下,你们在实际应用中使用过某种数据库访问技术的事务功能吗?这种应用是在什么请况下比较有价值呢?



网络虽虚拟,技术无边界,来看看大家“真面目”!
2007-8-24 00:131楼
[ 顶部 ]
 
cool技
助理工程师  点击可查看详细



帖子 430
精华 1
无忧币 2202
积分 1173
阅读权限 40
注册日期 2007-4-3
最后登录 2007-12-3 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-8-25 20:52 
如果你想把所有事务放在存储过程里面做,那么如果有新的业务逻辑,需要调用两个存储过程怎么办。你说用嵌套,那么事务的嵌套处理需要非常小心。这里还没考虑分布式事务。

____________________________________________________


这里先不考虑分布式事务,我提到的SqlTransaction类也不是用来处理分布式事务的。
对于你讲的“调用两个存储过程”的情况,我觉得大多数情况下,或许都可以使用一个存储过程去调用另一个存储过程。如果必要的话当然会涉及到事务的嵌套,这当然需要小心处理。
但是如果使用某种数据库联接技术支持的事务处理,有时同样会涉及到嵌套事务的。比如你在数据库联接上启动了事务,然后你访问数据库的时候涉及到了触发器,那么在触发器里面的逻辑就处在嵌套事务中。或者你调用了一个本身就包含了事务的存储过程,那么这个时候存储过程中的逻辑也是在嵌套事务中的吧。我觉得至少嵌套事务在有些情形下无法避免。



网络虽虚拟,技术无边界,来看看大家“真面目”!
2007-8-25 20:522楼
[ 顶部 ]
 
风暴狂想
新新人类  点击可查看详细



帖子 303
精华 0
无忧币 1213
积分 22
阅读权限 20
注册日期 2007-1-21
最后登录 2007-12-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-8-25 20:54 
你理解错了
“启动事务相当于T-SQL的begin transaction语句”

不是相当于,是就是。

如果你想把所有事务放在存储过程里面做,那么如果有新的业务逻辑,需要调用两个存储过程怎么办。你说用嵌套,那么事务的嵌套处理需要非常小心。这里还没考虑分布式事务。

所以最好最方便的方法就是在ADO里面做。



网络虽虚拟,技术无边界,来看看大家“真面目”!
2007-8-25 20:543楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号