高分求教sql事务的问题
有一订单表T_Order,里面订单编号字段OrderID在存储过程里面自动生成,生成规则如下:搜索订单表里当前最大订单编号(全为数字,不包含字母等其他字符),如当前最大订单为‘100001’,则自动生成订单编号为‘100002’依次类推。
现有多台机器同时下单,保存订单的存储过程如下:
CREATE PROCEDURE P_Order @ID nvarchar(50),@OrderID nvarchar(50)
AS
begin tran SetProperties
(此处自动生成订单编号)
(此出INSERT记录到订单表)
if @@error <> 0 GOTO Err_Handler commit tran SetProperties Return Err_Handler: rollback tran SetProperties Return
GO
现出现这样的问题:订单编号是不允许有重复的(但我没将其设成主键),可是多台机器同时下单时出现了重单的记录!分析应该是机器A在生成订单编号后,机器B已经将该订单编号的记录给INSERT进去了。
请问有没有什么好办法可以解决这一问题!是否可以在事务里面进行处理呢?? 谢谢!!
问题点数:50、回复次数:7Top
1 楼fengfangfang()回复于 2005-06-02 11:46:57 得分 0
加锁Top
2 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-06-02 11:49:15 得分 10
将订单编号定义为主键或者唯一索引列,或者将该字段创建为identity()属性列,让数据库自动维护定单号的递增。Top
3 楼maohaibin(永不言弃)回复于 2005-06-02 13:25:06 得分 0
将订单定义为主键后,当要插入重单时,系统就会报错了,行不通!让数据库自动维护订单号的递增也不可能,因为我在这里将订单号的生成规则简单化了,真正的生成规则是这样的:前六位数字是开单日期 如:050602 后四位数字为递增部分 合起来的订单形式就为:0506020001、0506020002、050602003等 然后到了6月3号开的单就会从 06030001开始递增了Top
4 楼BeShrek(今晚打老虎)回复于 2005-06-02 13:41:32 得分 0
加锁Top
5 楼quhaihua(七太保)回复于 2005-08-15 21:20:43 得分 10
begin tran
declare @rel int
exec @rel = sp_getapplock @Resource='Form1',
@LockMode ='Shared'
commit tran
加锁Top
6 楼netcoder(朱二)回复于 2005-08-15 21:39:13 得分 10
设置唯一约束或者主键约束
怎么会行不通呢,数据库本来就应该这么设计的
就是要系统报错,然后重新生成定单编号Top
7 楼snowwolf613(苦行僧)回复于 2005-08-16 11:14:32 得分 20
我也遇到過這個問題﹐不知你的訂單會不會有刪除﹐需要取斷優先嗎。
我的編碼規則如 maohaibin(永不言弃) 所說﹐同時還增加了字母排頭﹐是用個表來記錄其尾數每次產生單號﹐以尾數參與計算﹐產生完還未返回調用前端時即Update尾數﹐這樣﹐再怎么多人操作也不會取重復值Top




