public override int PrimaryKeyGenerator(string strTableName)
        {
            int iResult = 0;
            if (String.IsNullOrEmpty(strTableName)) return iResult;            string strSql = String.Format("SELECT MAX(Id) FROM {0}", strTableName);
            iResult = (int)MSAccessDAC.ExecuteForScalarNoParameters(strSql, false);
            iResult = (iResult == -1) ? this.InitKeyIdValue : iResult + 1;            return iResult;
        }
插入数据时,主键值调用这个函数.感觉多线程并发操作的时候可能会出问题,是不是得lock一个那个整形变量?
如果要加lock,应该怎么修改代码?除了数据库自增处理主键值,GUID外,还有没有别的办法.
大哥们给说说,你们这块是怎样做的,粘点儿码子更好.

解决方案 »

  1.   

    你这样做是不行的,
    如果 线程1 获取到max=1 但还没有插入数据库时
    线程2 再获取,同样获取到max=1,主见会重复.我的做法专门建立1个表来保存ID好
    crate table maxId(id int)
    在写个存储过程
      
    CREATE PROCEDURE [dbo].[GetNewId] 
    (@Tablename VARCHAR(50),
    @Num INT,
    @NewId INT OUTPUT
    )
    AS
    DECLARE @S NVARCHAR(500)
    BEGIN
     
    SET @S='UPDATE '+@Tablename 
    +' SET @NewId=ID=ID+@Num'
    PRINT @S
    execute sp_executesql  @S,N'@NewId INT OUTPUT,@Num INT',@NewId OUTPUT, @NumEND获取的时候直接调用存储过程,然后取 output值