SQL锁行,插入和选择时的表
我正试图实现对sql的某种锁定。 要解释我在做什么,很简单: 一个Id为int autoincrement作为PK的表,一个字段数据varchar(max)非集群IX 现在我有了一些C代码,simlpy会检查项目是否不在数据库中,并进行插入 我在后面使用的sql代码如下所示:SQL锁行,插入和选择时的表,sql,Sql,我正试图实现对sql的某种锁定。 要解释我在做什么,很简单: 一个Id为int autoincrement作为PK的表,一个字段数据varchar(max)非集群IX 现在我有了一些C代码,simlpy会检查项目是否不在数据库中,并进行插入 我在后面使用的sql代码如下所示: INSERT INTO {0}.{1} WITH (TABLOCKX) VALUES(@data...) 选择一个是: SELECT Id FROM {0}.{1} WITH (TABLOCKX) WHERE(Data
INSERT INTO {0}.{1} WITH (TABLOCKX) VALUES(@data...)
选择一个是:
SELECT Id FROM {0}.{1} WITH (TABLOCKX) WHERE(Data = @data)
但我可以看到,有些项目多次插入相同的值
TABLOCK会造成死锁,我不想使用unique索引,因为它非常慢
有没有一种方法可以通过锁定来实现这一点?我不确定这是否是您想要的,我希望这个回答会有所帮助
private void test(string aConnectionString, string aData)
{
using (SqlConnection sqlConnection = new SqlConnection(aConnectionString))
{
sqlConnection.Open();
SqlCommand sqlCommand = sqlConnection.CreateCommand();
SqlTransaction sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
sqlCommand.Connection = sqlConnection;
sqlCommand.Transaction = sqlTransaction;
try
{
sqlCommand.CommandText = @"IF NOT EXISTS(SELECT Id FROM {0}.{1} WHERE Data = @Data)
BEGIN
INSERT INTO {0}.{1}
SELECT @Data
END";
sqlCommand.Parameters.Add("@Data", System.Data.SqlDbType.VarChar).Value = aData;
sqlTransaction.Commit();
}
catch (Exception ex)
{
sqlTransaction.Rollback();
}
}
}
您可以对数据库中的列设置一个唯一的约束,这将防止在该列已经存在时插入相同的值ssql server 2008,并标记为,我不想在insert语句中使用unique INDEX,您在哪里检查结果在表中不存在?我在应用程序代码中这样做,如上所述,首先执行“select”,如果没有数据,我使用“insert”,一种简单可靠的方法是添加唯一约束并捕获“复制键”错误