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

我正试图实现对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 = @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”,一种简单可靠的方法是添加唯一约束并捕获“复制键”错误