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 获取到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值