--自己做编号,防止冲突的处理--处理示例1(用主键/唯一键)--得到最新编号的函数
create function f_newid()
returns char(7) --编号位数固定,用char的检索效率高于varchar
as
begin
declare @re char(7)
select @re=max(BHID) from 表 
return(
case when @re is null then 'BH00001'
else 'BH'+right('0000'+cast(cast(right(@re,5) as int)+1 as varchar),5) 
end)
end
go--测试的表,表名与函数中的表名对应
create table 表(
BHID char(7) default dbo.f_newid() --设置默认值,自动生成编号
primary key,  --设置成主键,防止编号冲突
-- constraint UNIQUE_BHID_表 unique, --如果用唯一约束,则删除上面的主键约束语句,改用此句
txt1 varchar(10),
txt2 varchar(10),
num  float)
go/*--插入数据时,就可以不理会编号字段,直接用这样的语句
多用户同时插入时,如果编号重复,就会有错误发生
此时,前台程序拦截错误,如果是违反约束的错误
只需要重新执行插入的语句即可,此时的编号会自动再重新生成
而重新执行插入语句也很方便,因为根本就不需要改语句
--*/
insert 表(txt1,txt2,num) values('aa','bb',1)go
--删除测试
drop table 表
drop function f_newid
--处理示例2(用表级锁)--得到最新编号的函数
create function f_newid()
returns char(7) --编号位数固定,用char的检索效率高于varchar
as
begin
declare @re char(7)
select @re=max(BHID) from 表(tablockx) --加表级锁
return(
case when @re is null then 'BH00001'
else 'BH'+right('0000'+cast(cast(right(@re,5) as int)+1 as varchar),5) 
end)
end
go--测试的表,表名与函数中的表名对应
create table 表(
BHID char(7) default dbo.f_newid() --设置默认值,自动生成编号
txt1 varchar(10),
txt2 varchar(10),
num  float)
go--用事务/配合函数中的锁,就可以实现在插入时锁定表
begin tran
insert 表(txt1,txt2,num) values('aa','bb',1)
commit trango
--删除测试
drop table 表
drop function f_newid/*--关于两种方法:设置主键或唯一键的处理效率是最高的,因为在处理数据的同时,其他用户还可以浏览数据,如果不用主键或唯一键,就要用表级锁,而用表级锁,在锁定时,其他用户是不能做任何操作的,这样在多用户环境下,进程肯定容易堵塞,造成千军万马过独木桥的情况.
--*/

解决方案 »

  1.   

    begin tran
    declare @maxid int
    select @maxid=isnull(max(id),0)+1 from tb with(tblockx)
    --操作@maxid
    end tran
      

  2.   

    begin tran
      SQL操作
    if @@error=0
       commit tran
    else
       rollback tran
      

  3.   

    用identity類型+計算列

    http://blog.csdn.net/roy_88/archive/2006/12/01/1424370.aspx
      

  4.   

    数据库是Oracle的,我想知道我就用GetMaxID()+1,如何解决?
      

  5.   

    你这个是并发问题,和事务有点关系,但不是事务的问题。
    Oracle的锁机制和SQL SERVER不一样,
    就算是SQLSERVER,2000和2005都有区别。
    你还是到ORACLE的版快问问吧。
      

  6.   

    oracle:
    转贴。--SQLSERVER2000有自动增长,下面是oracle的。
    create sequence seq_tab_g
    increment by 1
    start with 1
    maxvalue 9999999
    minvalue 1;
    --创建序列--seq_tab_g.currval   指当前序列
    --seq_tab_g.nextval   指下一个序列create table tab_g
    (column_id number,
    column_name varchar2(10));insert into tab_g values (seq_tab_g.nextval,'a');
    insert into tab_g values (seq_tab_g.nextval,'b');
    insert into tab_g values (seq_tab_g.nextval,'c');
    insert into tab_g values (seq_tab_g.nextval,'d');