CNDEV
CNDEV.ORG
当前在线
论坛
CBD
程序员情感CBD
程序员见面交流会
CBD开发区
Java/J2ME
.NET/C#
数据库
Delphi/BCB
Visual C
其它
修真养身
中国象棋
纪念日
谈钱太俗,还是投机吧
听音乐
iCosta
资源共享
一隅
好文共赏
看电影看美剧
待定
狗屎
雪域召唤
工作流
专业显摆区
语录
情感
批评与自我批评
爱情故事
发牢骚
看三点区
游戏
CNDEV-CS/WOW
浩宇长空
生活
家有XPH
我爱学英语
美食天地ORG
半调子体育迷
观澳园友邻
搞笑奇文
拍照片
我读书我存在
论坛系统
超级垃圾站
系统建议及BUG
系统测试
中国开发网
: 论坛:
程序员情感CBD
: 贴子 468825
就这么着
: 把生成订单和记录订单商品放在同一个事务处理中,可以解决这个问题吗?
[阅读: 654] 2007-01-31 03:09:53
<空>
相关信息:
[商城问题] 多商品的订单会出现乱单的问题吗?
(110字)
(
就这么着
[722]
2007-01-31 02:51
)
弄好了就不会,弄不好就会了
(空) (
sealw
[514]
2007-01-31 02:53
)
mssql不是可以取得本session的最后一个ID
(23字)
(
haitao
[731]
2007-01-31 02:54
)
你google一下什么叫做“数据库事务”
(19字)
(
Miracle
[610]
2007-01-31 02:55
)
把生成订单和记录订单商品放在同一个事务处理中,可以解决这个问题吗?
(空) (
就这么着
[653]
2007-01-31 03:09
)
不可以。如果你的程序胡乱写的话。
(空) (
pcplayer
[549]
2007-01-31 03:11
)
这个是基本要求
(空) (
dead_lee
[464]
2007-01-31 03:11
)
那位老大能具体给分析一下呀,谢谢阿
(空) (
就这么着
[441]
2007-01-31 03:12
)
你google一下什么叫做“数据库事务” (19字) (Miracle [7] 今天 10:55)
(空) (
dead_lee
[518]
2007-01-31 03:16
)
数据库事务我用过,目前我的想法是:生成订单和记录订单商品用两个过程实现
(空) (
就这么着
[561]
2007-01-31 03:19
)
如果一个过程搞定的话,就存在一个参数包含多个商品号的情况,这样是不是复杂一些呢?
(15字)
(
就这么着
[597]
2007-01-31 03:21
)
如果是oracle的话,sequence有curval来取得当前值的,sqlserver也有类似的@@啥的,忘记了
(空) (
dead_lee
[1121]
2007-01-31 03:43
)
你可以lock住订单表嘛
(14字)
(
品雪
[534]
2007-01-31 03:16
)
招会写的人去写
(空) (
cndev.org
[527]
2007-01-31 03:20
)
不是吧,讨论一下嘛,自己做了
(空) (
就这么着
[498]
2007-01-31 03:25
)
先生成订单号,再逐个往里面添加商品
(空) (
cndev.org
[498]
2007-01-31 03:26
)
我估计他是自己查询现存最大订单号然后加1生成新订单号的,这样做的话有并发请求就完蛋了
(空) (
Miracle
[618]
2007-01-31 03:29
)
我靠,这个想法有创意,我怎么没有想到过呢
(空) (
cndev.org
[505]
2007-01-31 03:32
)
没什么创意,我很久很以前试图这么做过,嘎嘎,真惭愧呀。
(空) (
Miracle
[526]
2007-01-31 04:32
)
no no no,人家用的是自增字段
(空) (
sealw
[516]
2007-01-31 03:39
)
哦哦哦哦哦
(空) (
Miracle
[479]
2007-01-31 04:16
)
大家看看里面的过程吧,这是我的想法
(635字)
(
就这么着
[645]
2007-01-31 03:43
)
你用@@IDENTITY这个吗?
(空) (
zhenghj
[508]
2007-01-31 03:45
)
因为订单表里的订单号是自增,这样应该取得的就是订单号吧
(空) (
就这么着
[625]
2007-01-31 03:49
)
查查@@IDENTITY返回的是什么
(空) (
zhenghj
[577]
2007-01-31 03:51
)
@@identity是返回最后插入的标识值的系统函数。用于获得刚分配的自动增长列的序号,应该就是订单号吧
(空) (
就这么着
[760]
2007-01-31 03:54
)
sql server可以把两个sql写在一起的,用分号分割
(空) (
dead_lee
[599]
2007-01-31 03:57
)
你能确定哪个是最后插入的
(空) (
zhenghj
[491]
2007-01-31 03:58
)
因为是在一个事务中,从Insert成功到获取到这个ID的时间间隙应该非常小吧
(空) (
就这么着
[627]
2007-01-31 04:12
)
是很小,但是理论上还是有可能发生的
(15字)
(
haitao
[573]
2007-01-31 04:16
)
还是我善解人意啊。。。。。。。
(94字)
(
haitao
[521]
2007-01-31 03:45
)
haitao的意思这样理解对吗?
(105字)
(
就这么着
[589]
2007-01-31 04:04
)
我说的session是数据库会话,它的id是不用你关心的
(149字)
(
haitao
[644]
2007-01-31 04:15
)
多谢haitao不厌其烦的解答,最后可否提供一下这个函数名,谢谢
(空) (
就这么着
[446]
2007-01-31 04:21
)
haitao的解释是错误的,不过那个函数名就是Scope_Identity()
(空) (
Miracle
[571]
2007-01-31 04:22
)
你说的不对,@@Identity作用于是当前会话。不受并发影响
(5355字)
(
Miracle
[1528]
2007-01-31 04:22
)
我没分清会话和作用域,不过@@id...应该相对不可靠
(107字)
(
haitao
[728]
2007-01-31 04:25
)
可靠不可靠取决用它的人
(空) (
Miracle
[502]
2007-01-31 04:27
)
用法当然要相同,否则怎么比较。。。。。。。
(34字)
(
haitao
[514]
2007-01-31 04:29
)
同一个会话不存在并发问题,都是串行的。
(7字)
(
Miracle
[571]
2007-01-31 04:31
)
问题是串行的代码行A和B之间会被间杂地执行了一个代码C。。。。
(33字)
(
haitao
[560]
2007-01-31 04:35
)
我败了
(空) (
Miracle
[528]
2007-01-31 04:39
)
完败
(39字)
(
haitao
[528]
2007-01-31 04:42
)
在我这个问题中用Scope_Identity和用@@Identity那个更好一些呀
(空) (
就这么着
[558]
2007-01-31 04:37
)
Scope_Identity!
(79字)
(
haitao
[838]
2007-01-31 04:48
)
在不考虑触发器时差不多
(空) (
zhenghj
[623]
2007-01-31 04:50
)
除了触发器,还有没有导致这种“伪并发”的可能?
(空) (
haitao
[498]
2007-01-31 05:28
)
单从存储过程来看,没有什么问题。
(空) (
Miracle
[528]
2007-01-31 04:24
)
我的担心是:第一个过程执行完,获取到订单号后,再执行第二个过程的时候,会不会订单号变成其它订单号了?
(空) (
就这么着
[519]
2007-01-31 03:46
)
你担心什么?验证过了吗?
(空) (
Miracle
[542]
2007-01-31 04:23
)
以前做的都是订单与商品是一对一的关系,一个过程搞定,多商品要分两步,所以担心第一步和第二步的衔接上会出问题
(空) (
就这么着
[628]
2007-01-31 04:28
)
我认为你的存储过程没什么问题,用事务保护一下应该就可以了。
(37字)
(
Miracle
[553]
2007-01-31 04:29
)
感谢大家热情洋溢的讨论,针对大家的讨论,我的总结如下
(54字)
(
就这么着
[502]
2007-01-31 04:48
)
你用GUID做唯一标示不就完了,犯得着这么折腾么...
(23字)
(
JoJo
[515]
2007-01-31 04:52
)
.
(空) (
zhenghj
[384]
2007-01-31 04:54
)
嘿嘿
(16字)
(
Miracle
[420]
2007-01-31 04:59
)
用GUID还不是也要考虑并发引起的订单号混乱呀
(空) (
就这么着
[676]
2007-01-31 05:01
)
如果你能用newid()函数生成重复的Guid,我请你吃满汉全席。
(空) (
Miracle
[858]
2007-01-31 05:02
)
请先证明你的赌注是不是空头支票
(空) (
haitao
[515]
2007-01-31 05:03
)
我知道Guid不会重复,问题因为某种原因而导致,我拿到的订单号是另一个Guid(会话外的新Guid),怎么办?
(空) (
就这么着
[713]
2007-01-31 05:05
)
那就
(6字)
(
JoJo
[400]
2007-01-31 05:09
)
晕,大哥很,关键还有一个业务层的问题,用Guid做订单号用户不方便记
(空) (
就这么着
[517]
2007-01-31 05:17
)
3934829341114好记么
(空) (
Miracle
[504]
2007-01-31 05:24
)
这么说吧,一天1W个订单不少了吧,运行10年,才会出现8位数的订单号呀,相对于Guid来说,容易记一些吧
(空) (
就这么着
[732]
2007-01-31 05:31
)
您再加个自增的列吧,不干别的,就是给用户好记用的。
(空) (
Miracle
[563]
2007-01-31 05:50
)
从商业角度来说,这么做也是不可取的
(12字)
(
JoJo
[476]
2007-01-31 05:57
)
嘎嘎
(12字)
(
Miracle
[464]
2007-01-31 06:00
)
你不觉得Guid那么长的一串,一看就很“专业”么
(空) (
Miracle
[582]
2007-01-31 06:01
)
用户看到大一串数字加字母的订单号,会发出专业的感慨来?
(空) (
就这么着
[540]
2007-01-31 06:04
)
你可以用十进制的形式表示
(空) (
JoJo
[530]
2007-01-31 06:07
)
这个倒是比较好记,但是订单查询的时候,麻烦就大了吧
(空) (
就这么着
[481]
2007-01-31 06:08
)
大吗?不就是个128位数么,有什么麻烦的。
(空) (
Miracle
[485]
2007-01-31 06:17
)
业务订单号可以在设置一个吧
(空) (
cndev.org
[543]
2007-01-31 05:29
)
啥叫“某种原因”
(57字)
(
Miracle
[498]
2007-01-31 05:23
)
再来关于这两个过程调用的程序,这样写有问题吗?
(203字)
(
就这么着
[549]
2007-01-31 04:55
)
如果事务代码没问题,那应该就可以了。
(空) (
Miracle
[493]
2007-01-31 05:03
)
既然你都用CRMapping了,为什么还用这么落后的数据库设计?
(20字)
(
JoJo
[513]
2007-01-31 05:11
)
JoJo很专业呀,俺用的是C#开发的,CRMapping是什么?俺比较菜,呵呵
(空) (
就这么着
[553]
2007-01-31 05:20
)
哦,笔误,应该是ORMapping
(空) (
JoJo
[526]
2007-01-31 05:43
)
。
(空) (
Miracle
[458]
2007-01-31 05:51
)
结贴,感谢大家,特别感谢haitao,Miracle等的热情解答
(空) (
就这么着
[467]
2007-01-31 05:35
)
欢迎光临本社区,您还没有登录,不能发贴子。请在
这里登录