楼主: wchal

三個菜鳥問題,請大家多多指教!

[复制链接]
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
11#
发表于 2004-5-24 12:03 | 只看该作者
第一个问题, 偶的考虑是如果事件的发生和触发器的处理不处于同一逻辑过程的时候应当考虑使用触发器, 而在同一逻辑过程中的时候则应考虑使用存储过程, 因触发器的使用会给事物管理带来一定的麻烦, 总之应该从功能概念的角度上思考这个问题而不是单纯从处理效率上考虑.
对于第二个问题, 偶想知道
当一个客户端使用时有没有这个问题?
两个客户端使用时, 是两个都有还是只有一个有?
另外
select @modify_YorN=field_A from table_A where field_B=@num_no
if @modify_YorN is not NULL
update table_A set field_C=’AA’ where field_B=@num_no

update table_A set field_C=’AA’
where field_B=@num_no
and field_A is not NULL<--根据你的处理方法这个条件好象也没有必要使用
在事务管理上是很不一样的前者是两个事务(除非你明确地开始事务)而后者是一个事务, 这会给处理带来很多细微的不同

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
12#
 楼主| 发表于 2004-5-24 12:29 | 只看该作者
to:lodge
謝謝你的回答!

當一個客戶端使用時應該沒有問題.現在問題太概是這樣,當兩個客戶使用時,正常的話如果表中無對應的記錄系統會在1秒內返回null值.如果表中有這個記錄也會在1秒內返回modyfy_YorN為一個非null的值.在不正常的時候一般系統要在兩三少秒才回返回null值.
我想可能是當客戶端a發出調用存儲過程x時,
客戶端b也發出調用存儲過程x,但a先調用,則b必須等待
a調用完b才可以調用x.
但實際可能是b根本沒有調用x!會不會是這樣?
那這個事物處理的問題要怎麼解決呢?
還有就是如果我不用先前的select語句前臺怎麼判斷到底有沒有這樣一條記錄呢?其實field_A字段全部是非null值的.

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
13#
发表于 2004-5-24 13:38 | 只看该作者
对于存储过程本身来说, 是没有竞合问题的, 因为竞合是指共有资源的竞合, 在这个例子中就是你要修改的那个表, 两个存储过程都要改同一个表就有可能有竞合问题了
不过是不是竞合和竞合在什么时候发生还是要靠你自己去调查, 感觉上你给出的那段语句不大象能引起竞合的样子
另外, 你的关注点也有点问题field_A是否为NULL并不重要, 输入@num_no要在表中存在才是问题的关键,mina1建议的用EXISTS来做判断的方法才是, 针对目的的方案

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
14#
 楼主| 发表于 2004-5-24 14:10 | 只看该作者
to:lodge
謝謝你!

如果我不用先前的select語句前臺怎麼判斷到底有沒有這樣一條記錄呢?
select @modify_YorN=field_A where field_B=@num_no
上面這句我的意思是說如果有這樣一條相符的記錄則將@modify_YorN賦為field_A的值也就是一個非null.如果沒有相符記錄@modify_YorN仍為null.我在前臺就是通過@modify_YorN的返回值來確定到底有沒有這張訂單.
用if exists(select * from ……)怎麼有返回值?

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
15#
发表于 2004-5-24 14:18 | 只看该作者
exists 是一个FUNCTION当其中的SELECT文有记录返回时为真否则为假, 这不正是你的要求吗
你如何把这个结果返回给前台, 应该不是问题吧

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
16#
 楼主| 发表于 2004-5-24 14:34 | 只看该作者
to:lodge
謝謝你!

我還想問一下:
select @modify_YorN=field_A from table_A where field_B=@num_no
if @modify_YorN is not NULL
update table_A set field_C=’AA’ where field_B=@num_no

if exists(select * from table_A where field_B=@num_no)
  begin
  select @modify_YorN=返回值1
  update table_A set field_C=’AA’ where field_B=@num_no
  end
的區別很大嗎?

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
17#
发表于 2004-5-24 15:03 | 只看该作者
区别在于, EXISTS不会因为field_A=NULL就说记录不存在(结果中field_A=NULL也可能是另有原因)
另外, 偶觉得, 你这个存储过程的逻辑有些怪, 本来是由前台来控制是否更新, 现在变成由存储过程来控制(有点没有必要了, 如果记录不存在自然不会更新), 然后再返回更新结果, 其实即使你不用EXISTS去判断(它只负责判断记录是否存在, 不能决定更新是否成功), 也应该有办法查出来更新是否成功(SQL中的方法偶就不清楚了, 让别的版主回答你吧), 因此, 如果你采用的是后一种方法, 你可以先更新,然后检查结果并返回, 前台发现是由于记录不存在而无法更新时就插入一条,
这样看起来就流畅了, 总之, 偶不知道你全部的流程, 觉得你的思路有些乱

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
18#
 楼主| 发表于 2004-5-24 15:31 | 只看该作者
to:lodge
謝謝你!

我的用意其實很單,就是前臺輸入一個號碼,然后后臺去查詢是否有這樣一條記錄.如果有則修改它.但是我前臺要知道到底有沒有這樣一個號碼的記錄.不知你認為我該怎麼寫!麻煩你幫我寫一下.謝謝了.

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
19#
发表于 2004-5-24 16:33 | 只看该作者
最初由 wchal 发布
[B]to:lodge
謝謝你!

我的用意其實很單,就是前臺輸入一個號碼,然后后臺去查詢是否有這樣一條記錄.如果有則修改它.但是我前臺要知道到底有沒有這樣一個號碼的記錄.不知你認為我該怎麼寫!麻煩你幫我寫一下.謝謝了. [/B]


非常抱歉, 偶不能帮你写这段代码, 因偶对SQL具体的命令了解不多, 偶只能告诉你写程序的原则.

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
20#
 楼主| 发表于 2004-5-24 16:56 | 只看该作者
to:lodge
謝謝!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表